Я пытаюсь определить, выполняется ли уже ksh script
, чтобы предотвратить выполнение второго экземпляра.
Скрипт запускается каждую минуту пользователем cronjob:
* * * * * /home/user/job.ksh TESTACTION &>/dev/null
Я добавил охрану в начале скрипта:
#!/usr/bin/ksh
LOGDIR="/home/user"
processes=$(/bin/ps ux | /bin/grep -i "job.ksh TESTACTION" | /bin/grep -v grep | /bin/grep -c "\/usr\/bin\/ksh")
if (( $processes > 1 )); then
datetime=$(/bin/date +'%Y.%m.%d %H:%M:%S')
/bin/echo -e "${datetime} - skipped execution for other ${processes} active process" >> "${LOGDIR}/multiple_ksh_check.log"
exit 0
fi
К моему удивлению, условие if
выполняется часто, но не всегда, как я могу видеть из файла журнала.
Учтите, что в целях тестирования я воспроизвел проблему с помощью этого фрагмента кода, что означает, что сценарий длится несколько миллисекунд, ни в коем случае не может длиться минуту, чтобы столкнуться со следующим вызовом cronjob.
Что мне не хватает? Что я могу попробовать?
$processes > 1
, также выгружает полный наборps
данных (т. е. не отфильтрованных черезgrep
вызовы) в файл журнала; с полным наборомps
данных вы, вероятно, обнаружите проблему с вашей логикой и / или дополнительную информацию о вашем сценарии оболочки, чтобы объяснить, почему$processes > 1
- person markp-fuso   schedule 30.06.2017ps
выходные данные, чтобы убедиться, что логика работает. Теория подпроцесса кажется мне более разумным (и последним) объяснением, и я думаю, что в конечном итоге виноват$(/bin/ps ux)
, но как я могу обойти это? - person Francesco   schedule 30.06.2017mypid=$$
); затем отфильтруйте любыеps
результаты, включающие$mypid
; это должно отфильтровать текущий процесс (процесс =$mypid
) плюс любые (недолговечные) дочерние процессы (родительский процесс =$mypid
); что-то вродеegrep -v " ${mypid} "
... обратите внимание на пробел до / после $ {mypid}, чтобы в редких случаях мы не отфильтровывали 1234, когда mypid = 123 - person markp-fuso   schedule 30.06.2017-w
вариантgrep
, чтобы предотвратить проблему с подстрокой, о которой вы упомянули. Еще несколько тестов, но я думаю, что это то, что я искал, спасибо - person Francesco   schedule 30.06.2017ps
, поэтому я выработал привычку использовать переменные ($ mypid, $ pid, $ ppid) для последующей обработки. - person markp-fuso   schedule 30.06.2017