Я думал, что это будет действительно просто, но, видимо, нет.
У меня есть демон (в настоящее время тестируется как обычный исполняемый файл на самом деле), и мне нужно контролировать, что он делает с веб-страницы. Посередине находится база данных MySQL, содержащая все необходимые данные, передаваемые в обоих направлениях. Все на одной машине.
Когда команда запускается с веб-страницы, PHP помещает соответствующие данные в базу данных, демон читает их и действует. Все идет нормально.
Однако, база данных опрашивает демон, поэтому существует временная задержка. Я хочу послать демону сообщение «посмотри сейчас». Поэтому я решил послать ему сигнал — SIGUSR1.
Это прекрасно работает, когда сигнал отправляется из командной строки (kill -SIGUSR1 ….), но не из системы PHP («kill -SIGUSR1 ….»).
Поэтому я подумал — команда внутренней оболочки, поэтому поместите команду kill в скрипт оболочки. Опять же, отлично работает при запуске из командной строки, но не из API системы Apache PHP.
Попробовал то же самое с помощью PHP posix_kill (), что также не удалось.
Похоже, проблема с разрешениями. У пользователя скрипта Apache нет прав на команду kill. Так что я подумал, хорошо — просто для тестирования в любом случае — SUID сценария. Вы не можете SUID скрипты, или так кажется.
Итак, sudo сделал скрипт в вызове system (), добавив скрипт и пользователя (www-data) в /etc/sudoers.d, чтобы не было запроса sudo password. Команда kill или pkill в сценарии по-прежнему возвращается с кодом 1 (разрешение запрещено), но выполняется от имени пользователя root.
Так что я застрял. Это кажется простым делом — отправьте демону сигнал «проснись». Но я не могу найти способ сделать это.
Ну, очень странно, после перезагрузки и без каких-либо других изменений подход sudo неожиданно сработал. Резюме:
Других решений пока нет …