私は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
continue
キーワードは、それが何を意味するかを意味するものではありません。これは、ループの次の反復に進むことを意味します。ループの外では意味がありません。
あなたが探していると思います
trap ' ' INT
シグナルの受信時に(フォアグラウンドジョブを強制終了する以外に)何もしたくないので、トラップにコードを挿入しないでください。空の文字列には特別な意味があるため、空でない文字列が必要です。これにより、信号が無視されます。
エラーはtrap 'continue' SIGINT
が原因で発生します。 help trap
から:
ARGは、シェルがシグナルを受け取ったときに読み取られて実行されるコマンドです。
したがって、スクリプトはcontinue
呼び出しを受信したときにSIGINT
コマンドを実行しようとしますが、continue
はループでのみ使用されます。