Bashに次のダミーコマンドがあるとします。
### dummy long_operation_cmd function, for easy reproduction:
function long_operation_cmd() {
echo "operation 1"
sleep 5
echo "operation 2"
}
現在、次のようにbashスクリプトを実行しています。
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' \
&& rm /tmp/logfile.tmp
これにより、バックグラウンドで長いジョブを安全に実行し、出力を追跡し、Ctrl + Cが実行を中断しないようにすることができます。
最も重要なのは、作業が完了したらsed
フォローモードから出ることができることです。
tail -f
私はに変更したかったのですがless +F
、これが私が思いついたものです:
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
less +F -- /tmp/logfile.tmp \
&& rm /tmp/logfile.tmp
===ALL DONE===
しかし、フォローモードに達したとき(またはタスクが完了したとき)は、long_operation_cmd
自動的にフォローモードから抜け出す方法が見つかりません。
このトラブルシューティングに関する提案はありますか?
答え1
「ALL DONE」の場合、プロセスに SIGINT 信号を送信できます。
kill -int PID
しかし、これを行うにはPIDを知る必要があります(less +F
バックグラウンドでも実行中ですか?)。
答え2
別の道を行くようです。
tail -f
Ctrl-Cを最初にキャプチャしてから減らしましょう。すべてが順調に進むと実行しませんが、「失敗」less
するとtail
(Ctrl + Cの場合)起動しにくくなります。必要に応じて「F」を引き続き使用できます。
最終結果は次のとおりです。
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
(trap : INT; tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' ) \
|| less +G /tmp/logfile.tmp && rm /tmp/logfile.tmp