スクリプトがマイルストーン間隔で実行されている間にスクリプトの実行時間を監視して通知を生成する方法はありますか?
AFAICS はwait
常に bash でブロックされます。
cron電子メールを鎮圧するためにSTDOUT、STDERRキャプチャでこれを使用する予定ですが、スクリプトが予想されるウィンドウを超えると(終了せずに)通知を受けたいと思います。
Googleは、私が探しているものではないtime
もの(追加のロジックなし)を引き続き通知します。timeout
答え1
プロセスをバックグラウンドで実行し、次のループのようなものを使用して監視するのはどうですか?この場合、カウンタを設定することもできます。たとえば、必要以上に3倍かかる場合は、プロセスを終了できます。
# Interval for checking status
readonly interval=10
# Your task here, maybe with some output redirections
sleep 100 &
# Infinite loop
while true
do
# Chill some time
sleep "$interval"
# Check if the background process still exists
if ps -p "$!" &> /dev/null
then
# Do something here, again maybe with >> logfile
echo "Process is still running!"
fi
done
答え2
この行をスクリプトの前に置いて調整できます。ジョブ実行の状態が と のin_queue
ように異なる場合は、ファイル記述子started
に対応する信号を書き込み、タイマーは間隔を&$fdtick
あけて信号を繰り返し、1分ごとに改行を印刷します。もちろん、ループは他の監視機能を含んでもよい。
ノート:>( ... )
プロセス置換と呼ばれ、bash
実行中のプロセスと新しい共同プロセスの間にパイプを作成して名前を付ける構文です。<( ... )
コンストラクタがパイプの読み出し端を保持している場合、同じことが行われます。
############################################################
# VISUAL TIMER #
# >$fdtick : tick input file descriptor #
# >stderr : visual output #
############################################################
exec {fdtick}> >(
((tick = 2, begintime = SECONDS))
while read -t $tick dot || { (( $? > 128)) && dot=${odot:-#}; }; do
odot=$dot
(( lastmin = durationmin, durationtick = (duration = SECONDS - begintime) / tick, durationmin = duration / 60 ))
while (( durationtick > lasttick )) ; do echo -n "$dot " ; ((lasttick++)) ; done
(( durationmin == lastmin )) || echo $durationmin
done >&2
) &&
trap "$(trap -p EXIT)"$'\n'"exec {fdtick}>&-" EXIT
sleep 50 ## long starting step
echo '.'>&$fdtick ## say the script is going on
sleep 50 ## long working step
## terminated, cleanup by trap EXIT