Driver86
@Driver86
Немодератор toster.ru

Почему зависает консоль ssh при завершении демона php?

Есть демон на php. В цикле действия и проверка, что получен сигнал. Если получен - выход из цикла. И завершение.

#!/usr/bin/env php
<?php
declare(strict_types=1);
declare(ticks=1);
$pid = pcntl_fork();
if ($pid) {
    echo 'Bot started.' . PHP_EOL;
    exit(0);
}
posix_setsid();
pcntl_signal(SIGTERM, function () {
    global $STOP;
    $STOP = true;
});
while (!$STOP) {
    //...
    sleep(1);
}
echo 'Bot stopped.' . PHP_EOL;
exit(0);


Проблема в том, что когда я завершаю демона командой kill pid, то он завершается, в консоль выводится "Bot stopped." и перевод строки и всё, консоль как бы зависает, будто бы ждёт ещё ответов от демона. Пока не нажму enter.

Как исправить? Чего ждёт консоль?
  • Вопрос задан
  • 199 просмотров
Решения вопроса 1
roswell
@roswell
и швец, и жнец, и на дуде игрец
Консоль просто не понимает, чего от неё хотят -- процессы-демоны и не должны выводить ничего в stdout и даже в stderr, для них обычно это плохо кончается. Сооруди описание сервиса для systemctl и рули процессом оттуда.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rPman
вы уверены что консоль зависает?
вы форкнули процесс, завершили первый, bash вывел приглашение ввода команд, после этого через секунду завершился второй процесс, и вывел сообщение - у вас теперь приглашение на предыдущей строке а курсор на новой чистой, и вы ждете чего то, хотя на самом деле bash у вас уже ждет ввода команды, вы ее можете вводить.

когда нажимаете enter, bash просто выводит повторно приглашение ко вводу команд
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы