Как вы прерываете процесс после запуска его с помощью exec ()?

#php #exec

#php #exec

Вопрос:

Если я запускаю процесс с помощью exec (), как я могу позже завершить этот процесс, скажем, нажатием / отправкой клавиши «q». Прямо сейчас, когда я выполняю процесс, PHP будет зависать, пока он не завершится и не вернется.

Ответ №1:

 function PsExec($commandJob) { 

    $command = $commandJob.' > /dev/null 2>amp;1 amp; echo $!'; 
    exec($command ,$op); 
    $pid = (int)$op[0]; 

    if($pid!="") return $pid; 

    return false; 
} 
  

позже…
exec(«kill -9 $ pid», $output);

Комментарии:

1. Привет, Кристо, мне было интересно, не мог бы ты развить свое предложение и помочь мне настроить его под мои нужды. 1. Не могли бы вы объяснить, что происходит с «amp; echo $!» частью «> /dev /null 2>amp;1 amp; echo $! «Возможно, если бы вы могли объяснить все это, это могло бы быть полезным, чтобы я мог убедиться, что я нахожусь на той же странице. 2. Мне нужно отправить вывод ошибки в определенный файл. Я не уверен, как заставить приведенную выше строку кода сделать это и заставить ее все еще работать. Спасибо за вашу помощь.

2. Хехе, Джейсон, если ты хочешь перенаправить на файл, тебе определенно не нужен такой синтаксис! Я думаю, все, что вы хотите, это:

3. Упс, извините, проблема с вводом выше… Если вы хотите перенаправить на файл, вам определенно не понадобится такой синтаксис! Я думаю, все, что вам нужно, это: $command = $commandJob.’ >> myParticularLogFile.txt 2>myParticularErrLogFile.txt amp; echo $!’; 2>amp;1 просто перенаправляет stderr на amp;1, который, в свою очередь, является сокращением для /dev / null в моем сообщении. amp; echo $! forks (amp;) echo $! для вывода pid, чтобы вы могли сохранить его. Вам нужен pid, чтобы иметь возможность завершить работу позже.

4. почему бы просто не обновить свой ответ вместо добавления в комментарии?

Ответ №2:

если вы хотите, чтобы ваш скрипт завершался независимо от того, выполнено ли выполнение, вы можете перенаправить вывод, помещенный в другой файл,

 exec("php dothis.php >> file.log");
  

я надеюсь, что это поможет вам

Комментарии:

1. Ибрагим, спасибо тебе за это предложение. Мне, однако, нужен способ завершить процесс, запущенный с помощью exec, и я не думаю, что это решило бы проблему.

Ответ №3:

Вы могли бы использовать pcntl_fork и pcntl_exec для запуска вашей программы и posix_kill для ее завершения.

Ответ №4:

Если я запускаю процесс с помощью exec (), как я могу позже завершить этот процесс, скажем, нажатием / отправкой клавиши «q».

Вместо использования exec вы могли бы посмотреть на использование proc_open , которое требует, чтобы вы передавали массив, определяющий три потока — один для stdin , один для stdout и один для stderr .

Это позволит вам легко вводить входные данные в программу во время обработки выходных данных, не блокируя просто ожидание его выполнения. Вы можете позже использовать proc_terminate , чтобы жестоко убить его, если это необходимо.

Комментарии:

1. Привет, Чарльз, спасибо за твое предложение. Я никогда раньше не использовал proc_open, и у меня возник вопрос, на который, я надеюсь, вы сможете ответить за меня. Было бы правильно сказать, что «дескриптор массива» предназначен для процесса, выполняемого командой. а массив pipels — это то, как php-скрипт будет взаимодействовать с новым процессом? Также дескриптор ресурса автоматически закрывается в конце скрипта, или вам нужно закрыть его вручную?