我以为这很简单,但显然不是。
我有一个守护进程(目前作为普通可执行文件测试),我需要从一个网页上控制它的功能。中间是一个MySQL数据库,其中包含了双向传递的所有必要数据。都在同一台机器上。
当从web页面发出命令时,PHP会将适当的数据放入数据库,守护进程会读取并执行操作。到目前为止,还不错。
但是,守护进程轮询数据库,因此存在时间延迟。我要做的是给daemon发送一条消息,告诉他“现在看”。所以我想我会给它发个信号-信号1。
当从命令行发送信号时(kill-SIGUSR1….),这工作得非常好,但不是来自PHP-system(“kill-SIGUSR1….”)。
所以我认为-内部shell命令,所以把kill命令放在shell脚本中。同样,从命令行运行时也可以,但不能从Apache PHP system()API运行。
使用PHP posix_kill()尝试了相同的方法,但也失败了。
似乎是权限问题。Apache脚本用户没有发出kill命令的权限。所以我想,好吧-无论如何只是为了测试-用脚本。你不能使用脚本,或者看起来是这样。
所以,在system()调用中sudo'd脚本,将脚本和用户(www data)添加到/etc/sudoers.d中,这样就不会有sudo密码提示。脚本中的kill或pkill命令仍然返回代码1(权限被拒绝),但它以根用户身份运行。
所以我卡住了。这看起来很简单——给守护进程发送一个信号说“醒醒”。但是,我找不到办法。
最佳答案
好吧,很奇怪,在重启之后,sudo方法突然起作用了。总结:
创建包含(pkill)命令的脚本
放入/usr/local/bin并使其可执行
为此命令向sudoers添加www数据(在/etc/sudoers.d中添加新文件)
从PHP Apache脚本作为系统调用(“sudo/usr/local/bin/script\uname”)