За последние 24 часа нас посетили 22624 программиста и 1277 роботов. Сейчас ищут 672 программиста ...

Запуск демона из скрипта

Тема в разделе "PHP для профи", создана пользователем Satger, 2 июл 2022.

Метки:
  1. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Как известно, в PHP есть несколько способов запустить внешнюю команду: exec, system, shell_exec, etc.

    А есть ли способ сделать так, чтобы запущенная внешняя команда осталась работать после завершения скрипта, её запустившего?
     
  2. lastdays

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

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Конечно можно. Хоть раз в 1 сек заставить "постоянно работать". Всегда можно погуглить, PHP DAEMON.
    Пример сюда не буду приводить, извини, лень.
     
  3. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Чувак, ты не въезжаешь.
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Есть. Например вышеперечисленным запустить батник с соответствующей командой
     
  5. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Ага, именно вот прям батник.
    Ещё можно кроном запустить, чё.

    Не, через жопу можно, это понятно. Вопрос был -- как оно задумано. Кажется, что никак. Поэтому, видимо, под RedHat-based системами достаточно &, а под Debian-based нужно ещё и
    nohup. Но я не уверен, ибо у меня нет ничего RedHat-based, чтобы проверить.
    А я надеялся, что PHP всё сделает за меня. Облом.
     
  6. DlTA

    DlTA Новичок

    С нами с:
    23 июл 2022
    Сообщения:
    34
    Симпатии:
    1
    то что работает у меня
    PHP:
    1. passthru('(/usr/local/bin/php -f ./setOrganic.php start &) >> /dev/null 2>&1');
    2. ...
    вызов завершается, а обработка продолжается
     
  7. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Чувак, ты не въезжаешь.
     
  8. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    К команде нужно дописать & > /dev/null 2> /dev/null и она будет работать хоть вечность. И это фишка не пхп, а линукса.
    --- Добавлено ---
    Никакие функции кстати использовать не обязательно. Если цель как нибудь выполнить команду, можно её просто прямо в коде взять в амперсанды `
     
  9. Batman

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

    С нами с:
    9 окт 2006
    Сообщения:
    72
    Симпатии:
    2
    Нашел в комментариях к официальной документации PHP по какой-то функции :)
    Код (Text):
    1.  
    2. function isWindows()
    3. {
    4.     return substr(php_uname(), 0, 7) == "Windows";
    5. }
    6.  
    7. function execInBackground($cmd)
    8. {
    9.     if (isWindows()) {
    10.         pclose(popen("start /B " . $cmd, "r"));
    11.     } else {
    12.         // "/dev/null &" execute in background
    13.         exec($cmd . " > /dev/null &");
    14.     }
    15. }
     
  10. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Да что-ж никто тему не читает?! Все писатели, ять. Ответ уже был дан, в сообщении № 5. Так что:

    Чувак, ты не въезжаешь.

    Так же как и все остальные придурки, начиная с модератора.
    Повторю сообщение №5, чисто чтоб все поняли:
    если просто добавить & в конце команды, то команда будет, конечно, исполняться в фоне, но будет убита с завершением процесса php, её запустившего. Чтобы совсем оторвать процесс от предка, нужно использовать nohup. Тогда процесс php может завершиться, но запущенная из него команда продолжит работать.
     
  11. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    не будет.
    Пишем скрипт 1.php:
    PHP:
    1. <?php
    2. `php 2.php >/dev/null 2>/dev/null &`;
    3. for ($i = 10; $i; $i--) {
    4.         echo $i;
    5.         sleep(1);
    6. }
    пишем скрипт 2.php:
    PHP:
    1. <?php
    2.  
    3. for ($i = 0; $i < 15; $i++) {
    4.         file_put_contents('log.txt', $i, FILE_APPEND);
    5.         sleep(1);
    6. }
    запускаем
    Код (Text):
    1. [root@server tmp]# php 1.php
    далее либо смотрим, как цикл досчитает до 1, либо убиваем его по Ctrl+C. В любом случае через 15 секунд, содержимое файла log.txt:
    Код (Text):
    1. 01234567891011121314
    Среда CentOS 7.9 без тюнинга. Ответы @DlTA @Batman и мой абсолютно правильные. С огромным любопытством жду описания обстоятельств, при которых может возникнуть описаная @Satger ситуация, иначе вся тема будет расценена как троллинг. Здесь некоторые возможно написали демонов больше чем ТС строк кода, это надо учитывать прежде чем обвинять кого-то в некомпетентности.
     
    don.bidon нравится это.
  12. Satger

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

    С нами с:
    19 апр 2020
    Сообщения:
    72
    Симпатии:
    1
    Смотри сообщение №5
     
  13. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    На Ubuntu 20.04.3 LTS результат тот же
    ubuntu.PNG
    Возможно на каких-то специфичных сборках результат другой. На нормальных системах nohup отсоединяет процесс от пользовательской сессии, а не от родительского процесса. Но ТС подробностей так и не предоставил, а потому отправляется в заслуженный бан за троллинг и нарушения пункта 1.1 правил Правила форума | Форум PHP Программистов | PHP.ru (в контексте пункта 1.2)
     
    #13 [vs], 26 авг 2022
    Последнее редактирование: 26 авг 2022