選択肢はほとんどありません。1つは、スクリプトを停止し(CtrlZ)、スクリプトのPIDを取得SIGKILL
してプロセスグループに送信することです。
コマンドがシェルで実行されると、コマンドが開始するプロセスとそのすべての子は同じプロセスグループ(この場合はフォアグラウンドプロセスグループ)の一部になります。このグループのすべてのプロセスに信号を送信するには、プロセスリーダーに送信します。以下の場合はkill
、コマンド、プロセス・リーダーは、このように表記されています。
kill -PID
PID
スクリプトのプロセスIDはどこにあります。
例:
test.sh
いくつかのプロセスを起動するスクリプトを考えてください。シェルで実行したとしましょう:
$ ./test.sh
別のターミナルで、
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
この場合、で作成されたプロセスグループにシグナルを送信するにはtest.sh
、次のようにします。
kill -INT -17802
-INT
は送信SIGINT
に使用されるため、このコマンドはCtrlC端末を押すのと同じです。送信するにはSIGKILL
:
kill -KILL -17802
別の端末を開けない場合にのみ、スクリプトを停止する必要があります。可能であれば、を使用pgrep
してPIDを見つけます。
スクリプトが起動するコマンドの1つはtrapping SIGINT
である可能性があり、これがおそらくCtrlC無効な理由です。ただし、SIGKILL
わなにかけることはできず、通常は最後の手段です。殺す前にSIGTERM
(-TERM
)を試してみてください。どちらSIGKILL
かSIGTERM
のように設定することができ、キーボードショートカットの方法がSIGINT
あります。
スクリプトにシェバン行が含まれていない場合、これはすべて意味がありません。このSOの答えから:
通常、親シェルは、スクリプトが同じシェル用に作成されていると推測します(最小限のBourneのようなシェルは/ bin / shでスクリプトを実行し、bashはbashサブプロセスとして実行します)...
このため、スクリプトの実行時に、スクリプトにちなんで名付けられたプロセス(またはコマンドラインにスクリプト名を持つプロセス)が見つからず、pgrep
失敗します。
常にシバンラインを使用してください。
Ctrl + z