За последние 24 часа нас посетили 17435 программистов и 1603 робота. Сейчас ищут 915 программистов ...

PHP-скрип как демон (Linux Ubuntu)?

Тема в разделе "PHP для новичков", создана пользователем rar, 28 окт 2009.

  1. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Сделал такую штуку. Скрипт на PHP, который работает вечным циклом и выполняет определенный алгоритм. Его я запускаю из командной строки с параметром ($ php prog.php start). Чтобы остановить скрипт, сделал специальный файл с флагом: при каждом цикле код обращается к файлу и смотрит, если 0 - то продолжаем цикл, если 1 - то остановка и, соответственно завершение скрипта. Останавливаю скрипт так же: $ php prog.php stop - читается параметр и изменяется флаг в файле на 1.

    Хочу узнать, возможно ли запустить скрипт как демон? Чтобы набрал команду запуска скрипта и он в фоновом режиме работал, и терминал можно было выключить. Если надо остановить, вызвал терминал и написал команду остановки.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Конечно можно.
     
  3. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Как?
     
  4. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    Ну так что ребята, есть какие-нибудь мысли по этому поводу?
     
  5. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Код (Text):
    1. nohup php script.php > /dev/null &
     
  6. rar

    rar Активный пользователь

    С нами с:
    9 дек 2008
    Сообщения:
    206
    Симпатии:
    0
    Адрес:
    Москва
    А как параметр программе передать?
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Хм, в процессе исполнения скрипту можно передать данные разве что через открытый сокет.
     
  8. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Расширения:
    http://php.net/pcntl
    http://php.net/posix

    Накатал примерчик:
    PHP:
    1. <?php
    2. $cmd = end($argv);
    3.  
    4.  
    5. // останов демона
    6.  
    7. if ($cmd == 'stop') {
    8.    $pid = file_get_contents('mydaemon.pid') or die("pid file not found!\n");
    9.    posix_kill($pid, SIGTERM);
    10.    exit;
    11. }
    12.  
    13.  
    14. if ($cmd !== 'start') die('use (start | stop)!');
    15.  
    16.  
    17. // Запуск демона
    18.  
    19.  
    20. // Форкаешь процесс.
    21. $pid = pcntl_fork();
    22.  
    23. if ($pid === -1) die('Could not fork');
    24.  
    25. // parent
    26. if ($pid) {
    27.    // сохраняешь pid демона
    28.    file_put_contents('mydaemon.pid', $pid);
    29.    exit(0);
    30. }
    31.  
    32. // child
    33. // отключаешься от терминала
    34. if (posix_setsid() === -1) die('Could not detach from terminal');
    35.  
    36. // регистрируешь callback сигнала остановки демона
    37. declare(ticks = 1);
    38. pcntl_signal(SIGTERM, 'dieMyDaemon');
    39.  
    40. function dieMyDaemon() {
    41.    echo "сервер трагично погиб\n";
    42.    unlink('mydaemon.pid');
    43.    exit;
    44. }
    45.  
    46. // работа демона
    47. while(true) {
    48.     sleep(1);
    49. }
    50.