Как перезапустить процесс, если условие становится истинным в bash-скрипте - PullRequest
1 голос
/ 18 июня 2019

Я использую скрипт 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 голосов
/ 18 июня 2019

Я написал небольшой скрипт, который создает дочерний процесс, представляющий ваш надоедливый пакет. Сценарий сам проверяет каждую секунду, был ли файл изменен и действует соответственно. Сценарий довольно прост, но, пожалуйста, спросите, если что-то неясно.

#! /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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...