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

Другие вопросы по тегам