Я создаю фоновый процесс, используя 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()
в том же сценарии?
Типичный способ сделать это для дочернего скрипта, чтобы получить свой идентификатор процесса (с getmypid()
в PHP) и выписать файл (обычно что-то вроде myscript.pid
), который содержит этот пид.
Затем все, что хочет завершить этот сценарий, проверяет наличие файла pid, читает его (и, возможно, на устойчивость, проверяет, каков целевой процесс в этом pid), а затем убивает целевой процесс. В PHP вы можете сделать это с posix_kill()
. (Обычно вы отправляете SIGTERM
или же SIGKILL
, но SIGHUP
, SIGINT
, или даже SIGUSR1
или же SIGUSR2
являются подходящими, в зависимости от того, что вы хотите, чтобы дочерний процесс делал при получении сигнала.
Кроме того, родительский процесс может получить pid ребенка с proc_get_status()
и напишите pid где-нибудь для дальнейшего использования. (Это может быть более подходящим, если вам нужно запустить несколько экземпляров дочернего элемента и / или дочерний процесс не может быть изменен таким образом.)
Также важно отметить, что в вашем звонке proc_open
, вы пытаетесь попросить оболочку охватить процесс в фоновом режиме. Это совершенно не нужно. proc_open
делает это сам, и, заставляя оболочку быть посредником, вы фактически подключаетесь к оболочке, а не к процессу, который пытаетесь запустить. (Это означает, что когда ваш сценарий существует, это также заставит оболочку убивать дочерний элемент, а не дочерний элемент, продолжающий работать в фоновом режиме.)
Других решений пока нет …