Как запустить / завершить фоновый процесс из скрипта PHP/bash?
У меня есть служба, в которой я перечисляю учетные записи в Твиттере и у меня есть переключатель, позволяющий включить / отключить соединение с Streaming API.
В настоящее время я планирую иметь этот поток:
- Пользователь включает учетную запись Twitter для потоковой передачи
- Электронное письмо отправляется администратору с правами доступа на сервере, который запускает процесс Phirehose для этой учетной записи.
- (Задание cron берет список учетных записей Twitter, для которых включена потоковая передача, и проверяет, существует ли для них процесс. Если нет, то отправляет электронное письмо администратору, который может перезапустить его.)
Я хотел бы запустить процесс Phirehose для запуска в фоновом режиме, когда пользователь хочет, чтобы учетная запись Twitter была включена для потоковой передачи. Также я хотел бы убить процесс напрямую, если пользователь хочет остановить потоковую передачу для этой учетной записи.
Есть несколько рисков и проблем с выполнением процесса Phirehose и особенно с его автоматическим уничтожением.
Какие-нибудь советы о том, как реализовать это с максимальной автоматизацией и минимальным вмешательством администратора?
2 ответа
Я проделал аналогичные вещи с помощью двухэтапного процесса: первая часть заключается в создании веб-интерфейса, который предоставляет команды запуска / остановки. Веб-интерфейс записывает файл на сервер. один для начала, один для остановки. start.lock, stop.lock.
вторая часть представляет собой bash-скрипт, который ищет наличие этих файлов. Ниже приведен пример сценария start.sh, который проверяет запуск службы. Он создает файл "running.lock", чтобы знать, не пытаться запустить запущенный сервис. Вы также можете использовать файлы для отчетности.
stop.sh и start.sh предназначены для частого запуска cron. Для моей цели они запускаются каждую минуту, и цикл в скрипте используется для более частой проверки. т.е. каждую минуту бегать и проверять 5 раз каждые десять секунд.
Я думаю, что с этим вы можете изменить ваши конкретные потребности. Надеюсь, поможет.
#!/bin/bash
for ((c=1; c<=5; c++))
do
file="start.lock"
if [ -f "$file" ]
then
sfile="running.lock"
if [ ! -f "$sfile" ]
then
<command goes here>
touch running.lock
rm start.lock
fi
fi
sleep 10
done
и остановить это
#!/bin/bash
for (( c=1; c<=11; c++ ))
do
file="stop.lock"
if [ -f "$file" ]
then
killall -9 <your service>
rm running.lock
rm start.lock
rm stop.lock
fi
sleep 5
done
В настоящее время я использую следующий скрипт, чтобы процесс phirehose всегда работал. Я хочу иметь возможность управлять им из php, поэтому я написал сценарий запуска также на php вместо bash.
Я добавил небольшой код, чтобы сообщить мне, какой тип ошибки произошел или нет, но всегда пытайтесь восстановить соединение.
phirehose-launcher.php:
<?php
while(1) {
passthru('/usr/bin/php my-phirehose-script.php', $code);
// if exits with error, show error but try to reconnect
if ($code) {
print "Encountered an error.\n";
print "Return code: $code.\n";
print "Waiting 5 seconds and will retry connection.\n";
sleep(5);
} else {
// if Phirehose exits gracefully, restart it
print "Script exited. Restarting.\n";
}
// Try again in 5 secs
sleep(5);
}
Если вы хотите, чтобы он работал в фоновом режиме, я не пробовал этого, но он должен работать, чтобы добавить & после имени скрипта либо в программе запуска (как в коде ниже), либо в сам скрипт программы запуска.
passthru('/usr/bin/php my-phirehose-script.php &', $code);
В моем классе PhirehoseConsumer я переписал метод log, чтобы сделать вывод для регистрации.
protected function log($message,$level='notice')
{
switch($level) {
case 'error':
print "Phirehose [ERROR]: $message\n";
break;
// should email these or text
case 'info':
print "Phirehose [INFO]: $message\n";
break;
case 'notice':
default:
// meh
break;
}
}
Вместо выхода из скрипта, я вижу зарегистрированный вывод как это:
Phirehose [INFO]: Idle timeout: No stream activity for > 90 seconds. Reconnecting.
Вы можете уничтожить скрипт запуска php, и дочерний процесс будет уничтожен. Что является простым способом управления процессом. И он перехватывает тайм-ауты простоя и выходы из phirehose, так что процесс продолжает работать, даже если потоковая передача прерывается или подключение к Интернету.