ターミナルでbashスクリプトの繰り返しを停止する方法は?

ターミナルでbashスクリプトの繰り返しを停止する方法は?

例えば、

#!/bin/bash
while :
do
    sl
done

このbashスクリプトを終了するには?

答え1

  1. Ctrl-Z一時停止スクリプトを押す
  2. kill %%

プロセスIDではなく、現在のシェルで最後に一時停止したバックグラウンドジョブにシグナル(デフォルトではSIGTERM)を送信したいと%%Bashの組み込み機能に通知します。kill

番号または名前でアクションを指定することもできます。たとえば、^Zでジョブを一時停止すると、bashは次のようにジョブ番号を通知します。[n]+ Stoppedここで、nジョブ番号は角かっこ内にあります。

ジョブ制御とジョブ終了の詳細については、bashまたはbashのマニュアルページで、、、および(help jobsすべて大文字)を検索してください。help fghelp bghelp killJOB CONTROLjobspec

例えば

$./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意図的に無視します。したがって、まずパラメータを追加して無視しないように指示する必要があります。SIGINTCtrl+CslSIGINT-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>

どちらの方法も要件を満たす必要があります。

関連情報