Убить процесс 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_open() остановить процесс. Есть ли способ остановить это, не имея proc_open() в том же сценарии?

2

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]