如果 bash 脚本中的条件变为 true,如何重新启动进程



我正在使用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

相关内容

最新更新