Убивание процесса cron и предотвращение его перезапуска

У меня есть запись cron, которая застревает, из которой я не могу вырваться. Задача cron запускает скрипт, который запускает наши ночные задания для нашей прикладной системы. Сценарий представляет асинхронные задания в планировщике заданий нашей прикладной системы. У нас есть несколько шагов, которые требуют ожидания завершения, прежде чем перейти к следующему заданию. Чтобы контролировать это, мы проверяем код возврата с сервера приложений. Если статус задания больше 59, он все еще работает. Следовательно, следующий код (нет команды «getjobstatus», но предположим, что он возвращает числовое значение для jobstatus ниже):

jobstatus=0 while [[ $jobstatus -lt 60 ]] do sleep 5 jobstatus=`getstatus whatever` done 

Я пытался убить процесс «сна», но он продолжает возвращаться. Как я могу предотвратить это и убить его навсегда?

Как упоминал Deathgrip в комментарии, вы должны убить родительский процесс sleep который вы можете найти с некоторым изменением ps | grep sleep ps | grep sleep ( ps имеет много реализаций, поэтому я не буду угадывать, какие именно флажки вам нужно предоставить или как выглядит ваш вывод. Check man ps )

Что происходит? Когда вы убиваете sleep он заканчивается, но это не влияет на выполнение содержащего скрипта … он просто переходит к следующей строке, и цикл продолжает циклироваться. Есть несколько способов изменить сценарий, чтобы убить сон. Один из самых простых заключается в том, чтобы сделать это: sleep 5 || exit sleep 5 || exit .

Альтернативно, если вы используете Bash (другие?), Вы можете просто добавить эту строку в начале: set -e . Это говорит Bash о завершении сценария, если какая-либо команда в сбой (т.е. возвращает ненулевой статус). Но это влияет на все в вашем скрипте и имеет ряд других ошибок, поэтому лучше избегать этого решения. (Вы можете добавить set -e в строку перед сном и отключить с помощью set +e сразу после него, но это становится нелепым, поскольку вы можете просто использовать первое решение, о котором я упоминал).

Если у вас есть процесс sleep в ваших взглядах, и этот процесс сна является частью сценария родительской оболочки, который выполняется в цикле, например, у вас есть, тогда вам придется убить этот родительский процесс, чтобы предотвратить эту (специальную) команду сна из снова начнется.

Возьмите PID этого процесса сна и найдите родительский процесс, а затем убейте его:

 $ ps -e -opid,comm,args|grep sleep 424241 sleep sleep 999 # for example $ ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE 424242 # for example $ kill $(ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE) 

Я думаю, вам может понадобиться что-то вроде этого: как остановить скрипт bash в терминале?

Поэтому в вашем случае, если вы используете SIGTERM вместо INT, поскольку в качестве задания cron я предполагаю, что вы пытаетесь убить его с помощью «kill» вместо ctrl + C:

 jobstatus=0 trap "exit" SIGTERM while [[ $jobstatus -lt 60 ]] do sleep 5 jobstatus=`getstatus whatever` done 

Должен разрешить весь сценарий убить, а не только команды сна

Извините за то, что вы сделали отдельный ответ, а не просто комментарий, но у меня нет достаточного количества баллов, чтобы оставлять комментарии.