PHP – убить процесс proc_open () в другом файле?

Я создаю фоновый процесс, используя proc_open() и мне интересно, как отменить или остановить этот фоновый процесс, из другого файла или действия, в то время как мой фоновый процесс все еще работает?

Вот мой код:

 $errorLog = './error.log'; $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("file", $errorLog, "a") // stderr is a file to write to ); proc_open("/var/bin/php /home/hello/myscript.php &", $descriptorspec, $pipes); 

Я уже читал о proc_terminate($process) но, похоже, для proc_terminate($process) требуется возвращать proc_open() . Есть ли способ остановить его, не имея proc_open() в том же скрипте?

Типичным способом сделать это является то, чтобы дочерний скрипт получил свой идентификатор процесса (с помощью getmypid() в PHP) и выписал файл (обычно что-то вроде myscript.pid ), который содержит этот pid.

Затем все, что хочет прекратить этот скрипт, проверяет наличие файла pid, читает его (и потенциально для надежности, проверяет, что такое целевой процесс на этом pid), а затем убивает целевой процесс. В PHP вы можете сделать это с помощью posix_kill() . (Обычно вы отправляете SIGTERM или SIGKILL , но SIGHUP , SIGINT или даже SIGUSR1 или SIGUSR2 являются подходящими, в зависимости от того, что вы хотите, чтобы дочерний процесс выполнял, когда сигнализировали.

В качестве альтернативы родительский процесс может получить pid ребенка с помощью proc_get_status() и написать pid где-то для последующего использования. (Это может быть более уместно, если вам нужно запустить несколько экземпляров дочернего элемента и / или ребенок не может быть изменен таким образом.)

Также важно отметить, что в вашем вызове proc_open вы пытаетесь попросить оболочку охватить этот процесс в фоновом режиме. Это совершенно не нужно. proc_open делает это сам, и, заставляя оболочку быть посредником, вы фактически подключены к оболочке, а не к процессу, который вы пытаетесь запустить. (Это означает, что, когда ваш скрипт существует, это также приведет к тому, что оболочка будет убивать ребенка, а не ребенок, продолжающий работать в фоновом режиме.)