Отправка сигнала SIGHUP с PHP через shell_exec - PullRequest
2 голосов
/ 10 октября 2011

Я пытаюсь отправить сигнал SIGHUP во внешний процесс, используя PHP.В настоящее время я делаю следующее:

$pid = shell_exec('ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\'');
shell_exec('kill -s HUP $pid');

Когда я запускаю « php test.php » из командной строки, я проверяю, что сигнал отправляется правильному процессу,как и ожидалось.

Когда я вызываю скрипт, посещая http://foo.com/bar/test.php,, сигнал не отправляется, и shell_exec ничего не возвращает.

Для тестирования я временно запустил PHP с правами rootно имел ту же проблему, поэтому я предполагаю, что это не проблема с разрешениями.

Интересно, что shell_exec возвращает выходные данные для команды pwd и uptime команда для браузера, но не команда ls .Но когда запускается из командной строки, shell_exec возвращает вывод из ls нормально.

Есть ли другое ограничение этих команд, которое я пропускаю?

Кроме того, несколько замечаний:

  • Безопасный режим выключен
  • error_reporting = E_ALL
  • Никакие функции не отключены
  • Я попытался явно указать на двоичные файлы (например, / bin / ps иsh -c ps)

1 Ответ

2 голосов
/ 10 октября 2011

Попробуйте

echo shell_exec('(ps -ef | grep mosquitto | grep -v grep | awk \'{print $2}\') 2>&1');

и посмотрите, нет ли сообщений об ошибках. Кроме того, вы можете попробовать pgrep, pkill или killall вместо того, чтобы возиться с ps и grep.

В качестве альтернативы, попробуйте просто запустить ps и самостоятельно проанализировать его полный вывод в PHP. (preg_match() и / или preg_grep() могут быть полезны для этого.) И вы можете использовать posix_kill() вместо запуска внешней программы kill.

Редактировать: Согласно комментариям, похоже, что фактическая проблема заключалась в отсутствующей или неправильно установленной переменной среды PATH. Одним из способов решения этой проблемы было бы запустить echo $PATH в оболочке, скопировать вывод и установить для PATH то же значение в PHP с putenv(). Другое решение - использовать which в оболочке для определения полных путей к ps и др. и использовать эти полные пути в shell_exec().

...