Process
暫停和恢復申請
我可以通過發送
SIGSTOP
andSIGCONT
信號來暫停和恢復程序。以火狐為例:
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