Я пытаюсь поддерживать длительный процесс php cli на Centos 7, но без особого успеха. Поэтому я прибегаю к паре bash сценариев - один для запуска процесса, другой - для проверки выполнения процесса и перезапуска его, если это не так. Сценарий перезапуска запускается каждые две минуты cron.
Это моя запись cron
*/2 * * * * bash /var/www/html/production/start_process.sh
Вот мои два скрипта
start_process. sh
#!/bin/bash
if ps -f | grep -q "[p]rocess_queue" ; then echo "Message queue process is already running" ; else bash /var/www/html/production/process_message_queue.sh; fi
process_message_queue. sh
#!/bin/bash
echo "Starting process message queue"
nohup php /var/www/html/production/index.php messages process_queue > process_message_queue.out 2> process_message_queue.err < /dev/null &
echo "Started process message queue"
Каждый сценарий при запуске через терминал работает так, как ожидается .
bash start_process.sh
либо вернет сообщение о том, что процесс запущен, либо запустит второй скрипт, который правильно запустит процесс PHP.
При запуске из cron, однако , первый скрипт запустится, а второй запустит. Я знаю это, потому что 2 повторяющихся утверждения появляются в / var / spool / mail / root. Но если я выполню ps -f
после запуска задания cron, процесс там не будет.
У меня есть полные пути к каждому сценарию оболочки, cron равен root, и каждый сценарий оболочки принадлежит root.