SIGSTOP
とシグナルを送信してプロセスを一時停止して再開できますSIGCONT
。
Firefoxを例に挙げましょう。
pkill --signal SIGSTOP firefox
pkill --signal SIGCONT firefox
実際、Firefoxには、、Web Content
などのいくつかの補助プロセスもあり、実行され続けWebExtensions
ますRDD Process
。
アプリケーションに属するプロセスグループ全体を一時停止して一時停止を解除する方法はありますか?
答え1
この種のことに対する一般的な答えは、プロセスに信号を送る必要があるということです。グループそしてコースだけではありません。生成されたすべてのプロセスは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
このグループには、XorgやMy Display Managerログインなどの基本的なツールを含む104のプロセスがあります。したがって、これは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を取得してから、Firefoxとそれを親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
答え2
pkill
これは、人によると、「名前に基づいて信号ハンドラを検索またはエクスポートする」ことができる素晴らしいツールです。また、いくつかのプロセスと一致します。すべての Web コンテンツと Web 拡張機能が同じファイル名で実行される限り、一時停止をできるだけpkill -19 firefox-esr
多く使用できます。すべてのサブプロセス。
ある時点では安全ではないかもしれません。 Firefoxの特定のインストール(ただしすべてのインスタンス)と一致させる場合は、fuser
次のコマンドを使用して指定されたシステムファイルを使用するプロセスの表示(PID)を照会できます。fuser /usr/lib/firefox-esr/firefox-esr | grep -Es "[0-9]+" | xargs kill -19
(-18回復)。
最終結果は、| xargs ps
プロセス状態を「Sl」(中断可能な省電力モード、マルチスレッド)に出力する接続を使用して確認できます。
答え3
Linuxがcgroups v2以降にアップグレードされたとしますID=1000
。
systemd-run --user --slice=firefox.slice firefox
# To freeze
echo 1 > /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/firefox.slice/cgroup.freeze
# To unfreeze
echo 0 > /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/firefox.slice/cgroup.freeze