Process

暫停和恢復申請

  • July 15, 2020

我可以通過發送SIGSTOPandSIGCONT信號來暫停和恢復程序。

以火狐為例:

pkill --signal SIGSTOP firefox
pkill --signal SIGCONT firefox

問題是 Firefox 也有輔助程序,如Web Content, WebExtensions, 並RDD Process繼續執行。

有沒有辦法暫停和取消暫停屬於應用程序的整個程序組?

這類事情的通常答案是您應該將信號發送到程序,而不是單獨的程序。產生的所有程序firefox都應該在同一個程序組中。確實,在我的系統上:

$ ps -aeo pgid,ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
  PGID    PPID     PID S COMMAND         COMMAND
  1095       1  151407 S firefox         /usr/lib/firefox/firefox
  1095  151407  151541 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151607 S WebExtensions   /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151689 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151711 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151738 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151765 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151802 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151876 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151889 S Web Content     /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151928 S Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab

所以通常情況下,我可以執行kill -19 -1095,這將暫停程序組的所有成員1095。不幸的是,至少在我的系統上,這個組不僅包含 Firefox:

$ ps -aeo pgid,ppid,pid,s,comm,args | awk '$1==1095' | wc
   104    1382   29087

該組中有 104 個程序,包括 Xorg 或我的顯示管理器登錄等基本工具。因此,雖然從技術上講,它會暫停 Firefox,但它也會暫停我的整個 GUI,使系統無響應。

因此,您可以使用以下-f標誌pkill

-f,–滿

該模式通常僅與程序名稱匹配。設置 -f 時,將使用完整的命令行。

如果我現在執行pkill -f -19 firefox,所有命令行匹配的程序firefox都將被掛起(查看S列):

$ pkill -f -19 firefox
$ ps -aeo ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
  PGID    PPID     PID S COMMAND         COMMAND
  1095       1  151407 T firefox         /usr/lib/firefox/firefox
  1095  151407  151541 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151607 T WebExtensions   /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151689 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151711 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151738 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151765 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151802 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151876 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151889 T Web Content     /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
  1095  151407  151928 T Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab

當然,這意味著,例如,如果您firefoxManual在文本編輯器中有一個名為 open 的文本文件,或者任何其他匹配的程序firefox,那麼它也將被掛起。

或者,如果您想 100% 確定您只獲得正確的程序,您可以獲取 Firefox 的 PID,然後向它發送一個信號,以及將其作為父 ID 的所有程序:

pkill -19 firefox; pgrep -P $(pgrep firefox) | xargs kill -19

你甚至可以把它變成一個函式:

myKill(){
   pkill "$1" "$2"; pgrep -P $(pgrep "$2") | xargs kill "$1"
}

您現在可以通過以下方式阻止它們:

myKill -19 firefox

並重新啟動:

myKill -18 firefox

引用自:https://unix.stackexchange.com/questions/597709