例えば、
#!/bin/bash
while :
do
sl
done
このbashスクリプトを終了する方法は?
プログラムsl
は意図的にSIGINT
を無視します。これは、を押すと送信されます Ctrl+C。したがって、最初に、-e
引数を追加して、sl
を無視しないようにSIGINT
に通知する必要があります。
これを試してみると、個々のsl
を停止できることに気づくでしょうが、それでも繰り返します。 bash
の後にSIGINT
も終了するように指示する必要があります。これを行うには、ループの前にtrap "exit" INT
を置きます。
#!/bin/bash
trap "exit" INT
while :
do
sl -e
done
Ctrl-Z
を押しますkill %%
%%
は、プロセスIDではなく、現在のシェルで最後に中断されたバックグラウンドジョブにシグナル(デフォルトではSIGTERM)を送信することを、bash組み込みkill
に通知します。
番号または名前でジョブを指定することもできます。例えば^ Zを使用してジョブを一時停止すると、bashは[n]+ Stopped
のようなジョブ番号を通知します。角括弧内のn
はジョブ番号です。
ジョブ制御とジョブの強制終了の詳細については、bashでhelp jobs
、help fg
、help bg
、help kill
を実行し、JOB CONTROL
(すべて大文字)を検索してください)またはbashのmanページのjobspec
。
例えば.
$ ./killme.sh ./ killme.sh:4行目:sl:コマンドが見つかりません ./ killme.sh:4行目:sl:コマンドが見つかりません ./ killme.sh:4行目:sl:コマンドが見つかりません ./ killme.sh:4行目:sl:コマンドが見つかりません ./ killme.sh:4行目:sl:コマンドが見つかりません ... ... ... ./ killme.sh:4行目:sl:コマンドが見つかりません ^ Z [1] +停止./killme.sh $ kill %% $ [1] +終了./killme。 sh
この例では、ジョブの番号は1だったので、kill %1
はkill %%
と同じように機能します。
(注:sl
をインストールしていないため、出力は「コマンドが見つかりません」です。あなたの場合、slが生成する出力は何でも得られます。重要ではありません-^Z
一時停止およびkill %%
は同じように機能します)
Ctrl + cでループを停止し、スクリプトを終了しない場合は、|| break
実行しているコマンドの後。実行しているプログラムがctrl + cで終了する限り、これはうまく機能します。
#!/bin/bash
while :
do
# ctrl+c terminates sl, but not the Shell script
sl -e || break
done
ネストされたループにいる場合は、「break 2」を使用して2つのレベルから抜け出すことができます。
最も簡単な方法は、通常Control-Backslash
に接続されているQUIT
信号を発行することです。
電車が見えたらControl- \を押します
このスクリプトを開始したターミナルからCtrl + Cを押すと、そのスクリプトを終了できます。もちろん、このスクリプトはフォアグラウンドで実行する必要があるため、Ctrl + Cでスクリプトを停止できます。
または、次のようにして、開いている他のターミナルでそのスクリプトのPID(プロセスID)を見つけることができます。
ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>
どちらの方法でも、求めているトリックを実行できます。
Shell(bash)のkill
pid
を実行できます。
試したところ、うまくいきました。ps -ef
(ループスクリプトで実行するジョブ)からプロセスが表示されないため。
スクリプト全体を終了する別の方法は、sl
コマンドをバックグラウンドで実行し、シグナルINT
をトラップして、スクリプトのプロセスグループ全体をシグナルHUP
で強制終了することです。
#!/bin/bash
trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT
while :
do
sl & wait
done