我正在使用bash脚本来运行包的多次迭代。我没有写这个包,它有一个烦人的功能,偶尔它似乎只是因为某种未知原因冻结,并且会挂起直到我杀死工作。当事情顺利运行时,程序会非常有规律地写入输出文件(根据经验每分钟左右(,所以我想做的是将文件上次写入的时间与当前时间进行比较,如果差异很大,比如一个多小时,重新启动当前迭代。
我已经找到了在长命令开始后的某个时候运行其他命令的 bash 解决方案,但似乎无法弄清楚如何将其推广到我需要的。
我正在寻找这样的东西:
for iteration in {0..100}
do
./(long_command)
while [ $current_time - $last_file_update < $hour ]
do
sleep 60
done
if[ (long_command is still running ) ]
then
(restart iteration)
fi
done
我写了一个小脚本,它创建了一个子进程,该子进程表示您烦人的特色包。脚本本身每秒检查文件是否已被修改,并相应地对其进行操作。脚本非常简单,但如果有什么不清楚的地方,请询问。
#! /bin/bash
MYFILE=file.txt
FILE_MOD_THEN=""
CHILD_PID=-1
MAX_WAIT_SECONDS=2
function run_command_hang {
for ((x=0; x<3; x++)); do
sleep 1
echo "derp" >> ${MYFILE}
done
sleep 10
}
function run_command_ok {
sleep 1
}
function run_command {
if [ $(($iteration % 2)) -eq 0 ]; then
echo "Starting hang"
run_command_hang &
else
echo "Starting ok"
run_command_ok &
fi
}
for iteration in {0..100}; do
run_command
CHILD_PID=$!
FILE_MOD_THEN=$(stat ${MYFILE} | grep 'Modify')
iteration_inner=0
while kill -0 ${CHILD_PID} 2>/dev/null; do
FILE_MOD_NOW=$(stat ${MYFILE} | grep 'Modify')
if [ ${iteration_inner} -gt ${MAX_WAIT_SECONDS} ]; then
echo "Process ${CHILD_PID} hangs! Killing.."
kill -9 ${CHILD_PID}
break;
elif [ "${FILE_MOD_NOW}" != "${FILE_MOD_THEN}" ]; then
echo "Process ${CHILD_PID} is active :D"
FILE_MOD_THEN=${FILE_MOD_NOW}
fi
sleep 1
((iteration_inner++))
done
done
exit 0