例えば、
#!/bin/bash
while :
do
sl
done
このbashスクリプトを終了するには?
答え1
Ctrl-Z
一時停止スクリプトを押すkill %%
プロセスIDではなく、現在のシェルで最後に一時停止したバックグラウンドジョブにシグナル(デフォルトではSIGTERM)を送信したいと%%
Bashの組み込み機能に通知します。kill
番号または名前でアクションを指定することもできます。たとえば、^Zでジョブを一時停止すると、bashは次のようにジョブ番号を通知します。[n]+ Stopped
ここで、n
ジョブ番号は角かっこ内にあります。
ジョブ制御とジョブ終了の詳細については、bashまたはbashのマニュアルページで、、、および(help jobs
すべて大文字)を検索してください。help fg
help bg
help kill
JOB CONTROL
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 %%
します。)
答え2
プログラムは、お客様が定期的に送信されることをsl
意図的に無視します。したがって、まずパラメータを追加して無視しないように指示する必要があります。SIGINT
Ctrl+Csl
SIGINT
-e
これを試してみると、誰もがブロックできますが、sl
まだ重複していることがわかります。bash
退室後も教えてください。ループの前に配置することでこれを行うSIGINT
ことができます。trap "exit" INT
#!/bin/bash
trap "exit" INT
while :
do
sl -e
done
答え3
ctrl + cを使用してループを停止し、スクリプトを終了しない場合は、|| break
実行中のコマンドの後にそれを入力できます。実行中のプログラムが Ctrl+C で終了する限り、正常に動作します。
#!/bin/bash
while :
do
# ctrl+c terminates sl, but not the shell script
sl -e || break
done
ネストしたループにある場合は、「break 2」を使用して両方のレベルを終了できます。
答え4
このスクリプトを起動した端末でCtrl + Cを押すと、このスクリプトを終了できます。もちろん、このスクリプトはCtrl + Cで停止できるように前景で実行する必要があります。
別の方法として、他の開いている端末でスクリプトのPID(プロセスID)を見つけることもできます。
ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>
どちらの方法も要件を満たす必要があります。