У меня есть задача запустить демон в фоновом режиме на рабочем сервере. Тем не менее, я хочу быть уверен, что этот демон всегда работает. Демон — это процесс PHP.
Я попытался подойти к этому, проверив, запущен ли демон, а если нет: запустите его. Итак, у меня есть команда вроде:
if [ $(ps ax | grep -c "akeneo:batch:job-queue-consumer-daemon") -lt 3 ]; then php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon & fi
Я сначала делаю if
с ps
а также grep -c
чтобы проверить, существуют ли процессы с заданным именем, а если нет: я запускаю команду, заканчивающуюся &
, заставляя его начать.
Приведенная выше команда работает, если я выполняю ее из командной строки, процесс запускается, и я вижу, что он работает, когда я выполняю простую ps ax
-command.
Однако, как только я пытаюсь сделать это с помощью crontab, он не запускается:
* * * * * if [ $(ps ax | grep -c "akeneo:batch:job-queue-consumer-daemon") -lt 3 ]; then php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon & fi
Я также установил MAILTO
— заголовок в crontab, но я тоже не получаю никаких писем.
Может кто-нибудь сказать мне, что не так с моим подходом? И как я могу начать это?
Простой и старый стиль — создать bash-файл, в котором вы в основном проверяете, запущен ли процесс, в противном случае вы запускаете его.
Вот содержимое файла bash:
#!/bin/bash
if [ $(ps -efa | grep -v grep | grep job-queue-consumer-daemon -c) -gt 0 ] ;
then
echo "Process running ...";
else
php /home/sibo/www/bin/console akeneo:batch:job-queue-consumer-daemon
fi;
Затем в файле crontab вы запускаете файл bash.
Для таких задач есть специальные службы. Например http://supervisord.org/
Supervisor — это система клиент-сервер, которая позволяет пользователям отслеживать и контролировать ряд процессов в UNIX-подобных операционных системах.
И вы можете управлять им через е.е. https://github.com/supervisorphp/supervisor
Команда, работающая в командной строке и не работающая в CRON, это случилось со мной, и вот что решило мою проблему.
Бежать echo $PATH
в вашем терминале скопируйте весь вывод.
Затем введите crontab -e
и в верхней части файла, напишите это
PATH=WHATEVER_YOU_COPIED_FROM_LAST_COMMAND_OUTPUT
PS: (больше предложений)
Я думаю, вам нужно установить apt-get install postfix
на Ubuntu, чтобы иметь возможность отправлять электронные письма.
Вы также должны увидеть журналы CRON
grep CRON /var/log/syslog
я бы порекомендовал вам использовать supervisord, он решает такие проблемы с автоматическим перезапуском на отказавших сервисах, кроме того, вы можете попытаться установить команды akeneo как сервис.
В противном случае, если вы захотите сделать это с помощью cronjobs, у вас может возникнуть проблема с бинарным файлом php, вам нужно установить абсолютный путь:
e.g : /usr/bin/php
Я также рекомендовал бы, если вы используете cronjob:
Проверьте журналы cronjob для дополнительных проблем
grep CRON / var / log / syslog
Очистите его с помощью автономного скрипта bash (не забудьте chmod + x)