シェルからコマンド(大きなプロジェクトではmake
)を実行すると、Ctrl-Zを押してプロセスを停止し、シェルに戻ることができます。その後、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を送信したときに再び開始した)と表示されていましたが、それでも出力が噴出してコア温度が上昇していました。 Ctrl-Zで停止することでこの問題が発生することはありませんでしたが、スクリプトでそれを行う方法がわかりません。
Ctrl-Zとkill -STOP
の違いは何ですか?また、シェルスクリプトで前者の動作を取得するにはどうすればよいですか?
Ctrl-Zと
kill -STOP
の違いは何ですか?また、シェルスクリプトで前者の動作を取得するにはどうすればよいですか?
CTRL-Z
は通常、SIGTSTP(ブロックされる可能性があります)を送信します。また、他のものとは別に、これらの場合、シェルはttyを以前に保存された状態にリセットすることがよくあります。ただし、より重要なのは、制御端末プロセスグループがシェルのPIDに設定されていることです(その後、fg
で再開されたジョブのPIDに設定されています)。
元の問題に戻ります。たとえば、温度依存の周波数スケーリングを使用します。 Cpufreqd は実際にはあなたの爪に良いハンマーかもしれません。
負のPID値(セッションリーダーのPGID)を指定すると、プロセスグループ内のすべてのプロセスにシグナルを送信できます。
kill -STOP -"$subpid"
注:新しいセッションでプログラムを実行するには、setsid make
を使用します。しかし、あなたの場合、それは必要ではないと思います。ただし、makeが再帰的に実行される場合、makeの各インスタンスが独自のリーダーになる可能性があります(それについてはわかりません)。
別のオプションは、killall
を使用することです。
killall -STOP make
Ctrl + Zとkill -STOPの違い: