#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 — так намного проще. Пожалуйста, добавьте упоминание ПУТИ к вашему ответу, и я отмечу его как принятый. Спасибо!