Проблема с демоном

rafaello

Новичок
Здравствуйте!
по этому ману создал демона
Проблема в том, что сразу плодится 10-20-30 процессов.
Демона делаю первый раз, возможно что то не до понимаю, прошу не пинать, а объяснить, где тут ошибка.
Вот файлы, которые сделал
mycro_n.php
PHP:
$stop = false;

$pid = pcntl_fork();
if ($pid == -1) {
    die('Error fork process' . PHP_EOL);
} elseif ($pid) {
    /**
     * В эту ветку зайдет только родительский процесс, который мы убиваем и сообщаем об этом в консоль
     */
    die('Die parent process' . PHP_EOL);
} else {
    /**
     * Бесконечный цикл
     */
//$sid = posix_setsid();
//if ($sid < 0){die('child process was not created');}     
$filename = __DIR__ . '/file.txt';     
    while(!$stop) {
        /*
         * Тело демона
         */
    file_put_contents($filename,PHP_EOL .time(), FILE_APPEND);     
    sleep(10);     
    }
}
/**
 * Установим дочерний процесс основным, это необходимо для создания процессов
 */
posix_setsid();
Установил supervisor и создал там конфиг

Код:
[program:process]
directory=/var/www/fastuser/data/www/my-site.ru/wp-content/themes/sparkling/inc/
command=/usr/bin/php mycro_n.php &
user=root
autostart=true
autorestart=true
numprocs = 1
stdout_logfile=/var/www/fastuser/data/www/my-site.ru/wp-content/themes/sparkling/inc/logs/process.log
stderr_logfile=/var/www/fastuser/data/www/my-site.ru/wp-content/themes/sparkling/inc/logs/process.error.log
после команды
sudo systemctl restart supervisor
сразу плодятся много процессов, в файл "file.txt" пишутся записи по 2-5 штук каждую секунду, хотя должно быть 1 запись каждые 10 секунд
 

WMix

герр M:)ller
Партнер клуба
В эту ветку зайдет только родительский процесс, который мы убиваем и сообщаем об этом в консоль
родительский нельзя убивать, это и есть запускаемый файл, на каждый fork будет создан процесс (те. fork в цикле главного процесса)
начнем сначала, fork это не о демоне а о параллельных процессах (с единой памятью - thread) про общение дочерних с родительским
вот типа hello world

вообще, не твоем месте я взял бы какой нить swoole там столько задач решено, что ты и представить не можешь
 
Последнее редактирование:

rafaello

Новичок
Я следовал логике того, указанного выше мануала.
Задача:
Создать бесконечный цикл для работы торгового бота на бирже
--------------
Раньше я просто использовал простую конструкцию
PHP:
while(1) {
    // Тут код Демона
    sleep(1);
}
Однако частенько бот по каким то причинам останавливался, то есть надо было постоянно контролировать, работает ли запущенный процесс (бесконечный цикл) или нет.
Теперь, по логике того самого мануала:
Смысл функции pcntl_fork() в том, чтобы отвязаться от консоли и уйти в фон
Но нам нужен только единственный дочерний процесс, а вышеуказанный код плодит большое множество процессов.
Возникают несколько вопросов:
1. Можно ли как то изменить первоначальный код, чтобы дочерний процесс был единственным?
2. Может ли Supervisor контролировать именно дочерний процесс?
3. Где можно найти примерно похожие решения для создания бесконечного процесса, который бы стабильно и управляемо работал, чтобы его в свою очередь использовать для реализации торгового бота?
 

AnrDaemon

Продвинутый новичок
Что бы ты ни делал, если ты не изменишь код работы самого бота, он так и будет останавливаться.
У тебя проблема не в цикле, а в боте.
 
  • Like
Реакции: AmdY

WMix

герр M:)ller
Партнер клуба
Supervisor контролирует процесс. никто не запрещает запустить таких 10 штук которые контролируются супервайзером. запуск процесса в фоновом режиме осуществляется по средствам амперсанда в конце команды,
Код:
$ php process.php &
также можно пользоваться screen

к чему тебе threads/дочерние процессы пока не понятно.

пользуйся transaction в базе и фиксируй в конце обработки успешное завершение
 

WMix

герр M:)ller
Партнер клуба
мы пользуемся https://www.php.net/manual/ru/function.proc-open.php
те запускаем основной процесс который читает задачи из queue, порождает процессы для выполнения, контролирует успешное завершение, закрывает задачу. с помощью supervisor контролируем основной процесс
 
Сверху