コマンドが中断された場合は、安全装置のウェイクアップを実行するために「watchdog」機能を使用します。これは、30秒間休止状態で目覚めるバックグラウンドタスクを実行することによって行われます。タイムアウト期間の前に親コマンドが成功すると、スクリプトはウォッチドッグを終了します。
関数をパイプする場合(sed
出力形式など)、バックグラウンドkill
ジョブで呼び出された後もスリープモード中に停止します。何を提供しますか?
これはMCVEです:
#! /bin/bash
function indent () { "$@" 2>&1 | sed 's/^/ /'; }
function sleeper () { sleep 1 && echo "Sleep complete."; }
function child () {
sleeper &
# ... do something that might hang here ...
local spid=$! echo "Invoked sleeper." | grep "sleep"
kill $spid
echo "Done child."
}
indent child
スリーパーがシャットダウンしても、プロセスは1秒間休止状態になります。
ベストアンサー1
少し変更し、sleep
親PIDを使用してプロセスを終了します$spid
。
#! /bin/bash
function indent () { "$@" | sed 's/^/ /'; }
function sleeper () { sleep 1 && echo "Sleep complete."; }
function child () {
sleeper &
local spid=$!
echo "Invoked sleeper." | grep "sleep"
pkill -P "$spid" sleep
echo "Done child."
}
indent child
問題は、バックグラウンドジョブが実行中に終了するまで送信された信号をsleep
実際に受信しないことです。上記のコマンドは、バックグラウンドジョブ自体ではなくプロセスにシグナルを送信します。TERM
sleep
pkill
sleep