スクリプトを終了せずにスクリプトの実行時間を監視し、マイルストーン間隔で通知を生成する方法は?

スクリプトを終了せずにスクリプトの実行時間を監視し、マイルストーン間隔で通知を生成する方法は?

スクリプトがマイルストーン間隔で実行されている間にスクリプトの実行時間を監視して通知を生成する方法はありますか?

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

関連情報