選択肢はほとんどありません。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