アプリケーションの一時停止と再開

アプリケーションの一時停止と再開

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

関連情報