Не знаю, идентично ли это, но я исправил подобную проблему несколько лет назад. Однако я программист, а не Unix-подобный системный администратор, поэтому примите следующее с долей соли, потому что мой Bash-fu может быть не таким сильным ...
В основном я делал форк, форк и вилку:)
Недостаточно памяти После восстановления моего старого кода (который я удивительно продолжаю использовать ежедневно), потому что моя память была недостаточно хороша, в Bash она работала примерно так:
commandThatMayHang.sh 2 > /dev/null 2>&1 & (notice that last '&', we're forking)
MAYBE_HUNG_PID=$!
sleepAndMaybeKill.sh $MAYBE_HUNG_PID 2 > /dev/null 2>&1 & (we're forking again)
SLEEP_AND_MAYBE_KILL_PID=$!
wait $MAYBE_HUNG_PID > /dev/null 2>&1
if [ $? -eq 0 ]
# commandThatMayHand.sh did not hang, fine, no need to monitor it anymore
kill -9 $SLEEP_AND_MAYBE_KILL 2> /dev/null 2>&1
fi
где sleepAndMaybeKill.sh спит необходимое количество раз, а затем убивает commandThatMayHand.sh .
Итак, в основном это два сценария:
ваша команда нормально завершает работу (до истечения 5-секундного тайм-аута или чего-либо еще), поэтому wait останавливается, как только ваша команда завершает работу нормально (и убивает «убийцу», потому что она больше не нужна
команда блокируется, убийца заканчивает тем, что убивает команду
В любом случае вы гарантированно либо преуспеете, как только команда будет выполнена, либо потерпите неудачу после истечения времени ожидания.