Отправка сигнала SIGHUP с помощью PHP через shell_exec

#php #bash #shell #ubuntu #signals

#php #bash #оболочка #ubuntu #сигналы

Вопрос:

Я пытаюсь отправить сигнал 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. Я должен сказать, что вопрос был хорошо задан, 1

Ответ №1:

Попробуйте

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

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

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

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

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

1. Ваш пример вывода кода: sh: ps: не найден sh: grep: не найден sh: grep: не найден . Я спросил друга, и он сказал, что выполнение /bin/sh -c ps должно работать, но аналогично это возвращает: /bin/sh: ls: not found

2. Вероятно, ваша PATH переменная среды установлена (неправильно) при запуске под веб-сервером. Либо это, либо вы работаете в какой-то ограниченной тюрьме, которая просто не позволит вам получить доступ к ps исполняемому файлу. Попробуйте запустить which ps в shell, чтобы узнать полный путь к ps и посмотреть, поможет ли это.

3. Кажется, это ПУТЬ. Я изменил свою исходную строку, чтобы использовать все абсолютные пути, и это сработало. Затем я решил использовать вместо этого pkill — так намного проще. Пожалуйста, добавьте упоминание ПУТИ к вашему ответу, и я отмечу его как принятый. Спасибо!