Как запустить / завершить фоновый процесс из скрипта PHP / bash?

У меня есть служба, в которой я перечисляю учетные записи Twitter и у меня есть переключатель, чтобы включить / отключить Потоковый API связь для них.

В настоящее время я планирую иметь этот поток:

  • Пользователь включает учетную запись Twitter для потоковой передачи
  • Электронное письмо отправляется администратору с доступом к серверу на сервере, который запускает Phirehose процесс для этой учетной записи.
  • (Задание cron берет список учетных записей Twitter, для которых включена потоковая передача, и проверяет, существует ли для них процесс. Если нет, то отправляет электронное письмо администратору, который может перезапустить его.)

Я хотел бы запустить процесс Phirehose непосредственно для запуска в фоновом режиме, когда пользователь хочет, чтобы учетная запись Twitter была включена для потоковой передачи. Также я хотел бы убить процесс напрямую, если пользователь хочет остановить потоковую передачу для этой учетной записи.

Есть несколько рисков и проблем с выполнением процесса Phirehose и особенно с его автоматическим уничтожением.

Какие-нибудь советы о том, как реализовать это с максимальной автоматизацией и минимальным вмешательством администратора?

0

Решение

Я сделал аналогичные вещи в два этапа:
Первая часть заключается в создании веб-интерфейса, который предоставляет команды запуска / остановки. Веб-интерфейс записывает файл на сервер. один для начала, один для остановки. 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
1

Другие решения

В настоящее время я использую следующий скрипт, чтобы процесс 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, так что процесс продолжает работать, даже если потоковая передача прерывается или подключение к Интернету.

0

По вопросам рекламы [email protected]