2009-09-07 4 views
2

Я создаю процесс с использованием proc_open в одном скрипте PHP.Как завершить процесс

Как прекратить это в другом скрипте. Я не могу передать ресурс, возвращенный proc_open.

Я также попытался использовать proc_get_status(), он возвращает ppid. Я не получаю pid детей.

развития окр: WAMP

Все входы ценится.

+0

Я думаю: Там нет никакого способа без обработки над какой-либо информацией о процессе. – tuergeist

+0

@tuergeist более или менее, это правда. В unix-like возможно открыть канал для этого процесса, когда вы откроете его, чтобы вы могли сказать, что он закрывается позже, но затем в системе без гражданства, такой как PHP, вы теряете ссылку на вызывающий процесс, если вы не используете сеанс или что-то похожее. в конце концов, вы должны отслеживать ЧТО-ТО, чтобы вы знали, как закрыть proc. –

+0

Обновление было бы неплохо. –

ответ

3

Я рекомендую вам пересмотреть свою модель, чтобы убедиться, что вам действительно нужно убить процесс из другого места. Ваш код будет все труднее отлаживать и поддерживать во всех, кроме самых тривиальных обстоятельствах.

Чтобы сохранить его в инкапсулированном состоянии, вы можете сигнализировать о процессе, который вы хотите завершить и изящно выйти в процессе, который хотите убить. В противном случае вы можете использовать обычный IPC для отправки сообщения, которое говорит: «Эй, приятель, выключи, пожалуйста».

Редактировать: для второго абзаца вы все равно можете запустить сценарий для этого. хорошо. то, чего вы хотите избежать, это вещь типа kill -9. вместо этого пусть процесс выходит изящно.

+0

Дело в том, что у меня есть html-страница с кнопками запуска и остановки. Начало начинается с скрипта под названием «start.php», где он создает новые процессы. Кнопка остановки должна остановить/завершить процесс. Как мне это сделать ? Насколько я могу думать, что функция остановки должна быть написана в отдельном скрипте? – Vidya

+0

Я так не думаю. У вас есть отчаяние. У вас есть доступ к файлам cookie. у вас есть доступ к файловой системе, где вы можете записать файл и т. д. (фактически, последний, который вы не можете, в зависимости от настроек безопасности). Вы можете сохранить pid процесса spanwed и вспомнить его позже и использовать методы, упомянутые выше. Извините, я не могу дать вам точный синтаксис; Я навсегда смотрю этот тип вещей сам. –

+0

На самом деле, если это всего лишь статический html, за исключением нескольких небольших скриптов php, то, вероятно, вопрос об ошибке не может быть и речи. –

0

Вы можете использовать некоторые методы для создания процесса, этот метод обычно возвращает PID нового процесса.

Это работает для вас? :

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 
$return_value = proc_close($process); 
+0

$ process здесь - ресурс, а не pid. Я не могу/не могу передать это другому сценарию, чтобы его прервать. – Vidya

+0

Существует $ process.pid, который можно использовать, вероятно. Вы можете записать его в файл (неэффективно) или отправить по сети другому процессу («script»). – bua

+0

$ process.pid возвращает «Идентификатор ресурса # 6pid». Что мне делать с этим? – Vidya

0

Вы лучше с помощью что-то вроде этого, чтобы запустить ваш другой процесс:

$pid = shell_exec("nohup $Command > /dev/null 2>&1 & echo $!"); 

Это было бы выполнить этот процесс, и даст вам бегущий идентификатор процесса.

exec("ps $pid", $pState);  
$running = (count($pState) >= 2);  

прекратить вы всегда можете использовать

exec("kill $pid"); 

Однако, вы не можете убить процессы, не принадлежащих пользователю PHP работает на - если он работает, как никто - вы будете начать новый процесс, как никто , и только сможет убивать процессы, запущенные под пользователем никого.

+0

Нет Мне нужно использовать proc_open, поскольку мне нужно отправить много команд в одном экземпляре. – Vidya

2

Чтобы сделать это в чистом PHP, вот решение:

posix_kill($pid, 15); // SIGTERM = 15 
Смежные вопросы