有没有办法可以监视脚本的执行时间并在脚本仍在按里程碑间隔运行时生成通知?
AFAICS,wait
在 bash 中总是阻塞。
我打算将其与 STDOUT、STDERR 捕获结合使用来平息 cron 电子邮件,但如果脚本超出其预期窗口(而不终止它),我希望发出通知。
谷歌只是不断向我指出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
文件描述符,计时器将每隔一段时间重复该信号,并每分钟打印一个换行符。当然,您的循环还可能包括其他看门狗功能。
笔记:>( ... )
称为进程替换,是一种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