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

时间:2019-06-18 14:29:09

标签: bash

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

1 个答案:

答案 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