make
大規模なプロジェクトでは、シェルでコマンドを実行するときにコマンドを入力してCtrlZプロセスを停止し、シェルに戻ることができます。その後、実行してfg
プロセスを続行できます。
私はこれを自動化するためのシェルスクリプトを作成しようとしています(具体的には、数秒ごとにCPU温度を確認し、温度が高すぎるとコンピュータが簡単に過熱するため、プロセスを停止します)。私の最初の試みは次のとおりです(単純化)。
make &
subpid="$!"
sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"
sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"
wait "$subpid"
残念ながら、これはうまくいきませんでした。SIGSTOP
プロセスへの転送はプロセスを一時停止しませんでした(ターミナルに出力を転送し続けたという事実からわかります)。make &
コマンドラインから実行し、;を使用SIGSTOP
してプロセスの状態を確認しますps
。停止したとマークされていますが(送信したときに再起動しましたSIGCONT
)、まだ出力を吹き出し、コア温度を上げていました!停止するCtrlZこの問題は発生したことはありませんが、スクリプトでこれを行う方法がわかりません。
CtrlZとどう違うのkill -STOP
?シェルスクリプトで前者の動作をどのように取得できますか?
答え1
Ctrl-ZはCtrl-Zとどのように異なり、
kill -STOP
シェルスクリプトでCtrl-Zの動作をどのように取得できますか?
CTRL-Z
SIGTSTPは通常送信され(ブロックされる可能性があります)、この場合、シェルはしばしばttyを以前に保存された状態にリセットします。ただし、さらに重要なのは、制御端末プロセスグループがシェルのPIDに設定され、再び回復を使用するジョブのPIDに設定されることですfg
。
元の質問に戻ります。温度に応じた周波数スケーリングを使用してください。CPU周波数実際に釘を打つのに良いハンマーかもしれません。
答え2
負のPID値(セッションリーダーのPGID)を指定すると、プロセスグループ内のすべてのプロセスに信号を送信できます。
kill -STOP -"$subpid"
注:新しいセッションでプログラムを実行するには、を使用しますsetsid make
。しかし、あなたの場合は必要ではないと思います。ただし、makeが再帰的に実行されると、各makeインスタンスが独自のリーダーになる可能性があります(これはわかりません)。
別のオプションは、次のものを使用することですkillall
。
killall -STOP make
Ctrl+Z と kill -STOP の違い:
- Ctrl-Z は、実際にブロックできる TSTP を送信します。
- STOPはブロックできません。
答え3
プロセスを停止したくないので、プロセスmake
を停止したいと思います。make
そしてすべての子プロセス。 makeが再帰的に実行されているようです。
試したset -m
後に%1
使用できます"$subpid"
。
set -m
スクリプト内でデフォルトでオフになっているジョブ制御を有効にします。それでもユースケースに合うべきだと思います。これが悪い考えだというのが一般的な合意があるようです。。
答え4
Ctrl+はC信号を介してプロセスを終了するために使用されますSIGINT
。つまり、礼儀です。殺す。
Ctrl+Z シグナルを送信してプロセスを一時停止するために使用されます。信号プロトコル、これはキャンセルでき、プロセスを再開できる睡眠信号と同じです。
ただし、プロセスが一時停止したら、次の方法で再開できます。fg
(フォアグラウンドで復元)そしてbg
(バックグラウンドで継続)ただし、終了したプロセスを再開できません。Ctrl+ C&+を使用するCtrlことの違いですZ。
どのようによりプロセスを一時停止しますか?
保留中のコマンドが複数ある場合、それらをリストするにはこのjobs
コマンドを使用します。出力は次のとおりです。
[1]- Stopped cat
[2]+ Stopped vi
どのように殺すバックグラウンドにプロセスがかかっていますか?
kill
次のコマンドを使用して:
kill %n
どこNはジョブ番号(ジョブ出力で括弧内の数字)なので、cat:を終了したいと思いますkill %1
。