web-dev-qa-db-ja.com

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

例えば、

#!/bin/bash
while :
do
    sl
done

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

58
Yinyanghu

プログラムslは意図的にSIGINTを無視します。これは、を押すと送信されます Ctrl+C。したがって、最初に、-e引数を追加して、slを無視しないようにSIGINTに通知する必要があります。

これを試してみると、個々のslを停止できることに気づくでしょうが、それでも繰り返します。 bashの後にSIGINTも終了するように指示する必要があります。これを行うには、ループの前にtrap "exit" INTを置きます。

#!/bin/bash
trap "exit" INT
while :
do
    sl -e
done
72
Jim Paris
  1. スクリプトを一時停止するには、Ctrl-Zを押します
  2. kill %%

%%は、プロセスIDではなく、現在のシェルで最後に中断されたバックグラウンドジョブにシグナル(デフォルトではSIGTERM)を送信することを、bash組み込みkillに通知します。

番号または名前でジョブを指定することもできます。例えば^ Zを使用してジョブを一時停止すると、bashは[n]+ Stoppedのようなジョブ番号を通知します。角括弧内のnはジョブ番号です。

ジョブ制御とジョブの強制終了の詳細については、bashでhelp jobshelp fghelp bghelp 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 %1kill %%と同じように機能します。

(注:slをインストールしていないため、出力は「コマンドが見つかりません」です。あなたの場合、slが生成する出力は何でも得られます。重要ではありません-^Z一時停止およびkill %%は同じように機能します)

128
cas

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つのレベルから抜け出すことができます。

7
Dale Anderson

最も簡単な方法は、通常Control-Backslashに接続されているQUIT信号を発行することです。

電車が見えたらControl- \を押します

4
RobertL

このスクリプトを開始したターミナルからCtrl + Cを押すと、そのスクリプトを終了できます。もちろん、このスクリプトはフォアグラウンドで実行する必要があるため、Ctrl + Cでスクリプトを停止できます。

または、次のようにして、開いている他のターミナルでそのスクリプトのPID(プロセスID)を見つけることができます。

ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>

どちらの方法でも、求めているトリックを実行できます。

4
panaroik

Shell(bash)のkillpidを実行できます。
試したところ、うまくいきました。
ps -ef(ループスクリプトで実行するジョブ)からプロセスが表示されないため。

1
Suwarto

スクリプト全体を終了する別の方法は、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
0
chanze