Ctrl + Cで、現在のコマンドを強制終了しますが、スクリプトの実行は続行します


10

私はライン、いつかのために睡眠してから実行して前記Iは、bashスクリプトを持ってtail -f、特定のパターンが見られていることを確認するために私のログファイルを、私はCtrl + Cを押してから抜け出すために、tail -fその後、bashスクリプトの終了の実行までに次の行に移動します:

これが私がこれまでに行ったことです:

#!/bin/bash


# capture the hostname
host_name=`hostname -f`


# method that runs tail -f on log_file.log and looks for pattern and passes control to next line on 'ctrl+c'

echo "==================================================="
echo "On $host_name: running some command"
some command here

echo "On $host_name: sleeping for 5s"
sleep 5

# Look for: "pattern" in log_file.log
# trap 'continue' SIGINT
trap 'continue' SIGINT
echo "On $host_name: post update looking for pattern"
tail -f /var/log/hadoop/datanode.log | egrep -i -e "receiving.*src.*dest.*"


# some more sanity check 
echo "On $host_name: checking uptime on process, tasktracker and hbase-regionserver processes...."
sudo supervisorctl status process


# in the end, enable the balancer
# echo balance_switch true | hbase shell

スクリプトは機能しますが、エラーが発生します。何を変更する必要がありますか/何が間違っていますか?

./script.sh: line 1: continue: only meaningful in a `for', `while', or `until' loop

このページの訪問者にも潜在的に関連unix.stackexchange.com/questions/163561/...
pestophagous

回答:


10

continueキーワードは、あなたはそれが意味だと思うものは何でも意味するものではありません。これは、ループの次の反復に進むことを意味します。ループの外では意味がありません。

あなたが探していると思います

trap ' ' INT

シグナルの受信時に(フォアグラウンドジョブを強制終了する以外に)何もしたくないので、トラップにコードを挿入しないでください。空の文字列には特別な意味があるため、空でない文字列が必要です。これにより、信号が無視されます。


1
それともtrap : INT
ステファンChazelas

1

エラーはが原因で発生しtrap 'continue' SIGINTます。からhelp trap

ARGは、シェルがシグナルを受信したときに読み取られ実行されるコマンドSIGNAL_SPECです。

したがって、スクリプトはcontinue受信SIGINT呼び出し時にコマンドを実行しようとしますが、これcontinueはループでのみ使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.