我正在使用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
答案 0 :(得分:0)
我写了一个小脚本来创建一个子进程,该子进程代表您烦人的特色包。脚本本身每秒检查文件是否已被修改,并对其进行相应的操作。该脚本非常简单,但是请问是否不清楚。
#! /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