我以为这会很简单,但显然不是。
我有一个守护进程(目前正在测试作为正常的可执行实际上),我需要控制它做什么,从一个网页.坐在中间是一个MySQL数据库包含所有必要的数据传递在两个方向.所有在同一台机器上.
当一个命令从网页发出,PHP把适当的数据放入数据库,守护进程读取它和行动。到目前为止,一切顺利。
然而,守护进程轮询数据库,所以有一个时间滞后。我想做的是发送守护进程一个消息说'现在看'。所以我想我会发送它一个信号-SIGUSR 1。
当信号从命令行(kill -SIGUSR 1....)发送时,这绝对可以正常工作,但从PHP - system(“kill -SIGUSR 1....”)发送时就不行了。
所以我想- internal shell命令,所以把kill命令放在shell脚本中。同样,从命令行运行时工作正常,但从Apache PHP system()API时就不行了。
尝试使用PHP posix_kill()执行相同的操作,同样失败。
看起来是权限问题。Apache脚本用户没有权限发出kill命令。所以我想,好吧-反正只是为了测试- SUID脚本。你不能SUID脚本,或者看起来是这样。
因此,在system()调用中对脚本进行sudo,将脚本和用户(www-data)添加到/etc/sudoers.d中,这样就不会出现sudo密码提示。脚本中的kill或pkill命令仍然返回代码1(权限被拒绝)-但它是以root用户身份运行的。
所以我被困住了。这看起来很简单--给守护进程发送一个信号说“醒来”。但是,我找不到这样做的方法。
2条答案
按热度按时间t5fffqht1#
嗯,很奇怪,重新启动后,没有其他变化sudo方法突然工作.总结:
1.创建包含(pkill)命令的脚本
1.放在/usr/local/bin中并使其可执行
1.将www-data添加到此命令的sudoers(/etc/sudoers.d中的新文件)
1.从PHP Apache脚本作为系统调用(“sudo /usr/local/bin/script_ name”)
fcwjkofz2#
这个解决方案非常聪明,但在使用
我现在的系统没有问题
但是,这在我的开发系统上失败,使用
说“sh:1:/var/www/发送到记录器的消息:未找到”
它看起来确实像只虫子。