Как запустить один bash скрипт из другого - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь поддерживать длительный процесс 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.

1 Ответ

1 голос
/ 21 февраля 2020

Помимо исправления основной проблемы с помощью вашей команды PHP (и причины ее сбоя), я бы рекомендовал использовать это поведение как службу вместо задания cron. Это дает дополнительное преимущество немедленного перезапуска при сбое (в отличие от cron, где вам придется ждать до следующей минуты). Например, если вы используете systemd, вы можете добавить следующую службу (/etc/systemd/system/charliefortune.service):

[Unit]
Description=CharlieFortuneService
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/var/www/html/production/process_message_queue.sh

[Install]
WantedBy=multi-user.target

и изменить process_message_queue.sh на:

#!/bin/bash
echo "Starting process message queue"
php /var/www/html/production/index.php messages process_queue > process_message_queue.out 2> process_message_queue.err  # This blocks
echo "Started process message queue"

Вы также получить хороший вывод журнала в вашем сервис-менеджере

Я понимаю, что это скорее комментарий, чем ответ, но мне не хватает репутации, чтобы комментировать ваш вопрос.

...