我刚刚安装了 Apache (2.2.3/Centos) + PHP(5.1.6),存在以下问题:我需要监视一个进程的生命周期,为此我运行:
$last_line = exec('ps -C snmpd');
并检查其输出。
不幸的是我总是什么也得不到。我用其他进程名检查过,似乎它只能“看到”Apache 的进程。
知道如何解决这个问题吗?
更新:
其他命令的执行system('snmpget -v2c -c public localhost '.$oid, $retval);
效果很好,只有 有问题ps
。奇怪的是(对我来说),当我以apache
用户身份登录并ps
手动运行时,它可以正常工作(显示所有内容)。
答案1
您将只能看到 Web 服务器正在运行的用户的进程,因为这是执行命令的用户。
如果您需要以不同用户身份运行命令,请查看 suexec。http://httpd.apache.org/docs/2.2/suexec.html
答案2
尝试运行更完整的ps
调用,例如:
ps aux | grep -i snmpd | grep -v grep
答案3
您也可以使用反引号运算符来实现相同的目的。我确认它可以工作,而 exec 则不行。
$out = `ps -aux|grep pianobarfly|grep -v grep`;
答案4
可能是 selinux。SELinux 限制 httpd 运行的域,因此它只能查看自己的进程。
您可以:-
- 关闭 selinux(不建议这样做)- setenforce 0
- 使 httpd 不使用 selinux(也不推荐这样做因为 httpd 是一个可能的攻击媒介)setsebool -P httpd_disable_trans = 1。重新启动 httpd。
- 更改策略以允许查看 /proc 中的进程。
这应该可以做到:-
policy_module(myhttpd,1.0.0)
gen_require(`
type httpd_t;
')
kernel_read_system_state(httpd_t);
从 yum 安装 selinux-policy-devel。
然后运行命令“make -f /usr/share/selinux/devel/Makefile load”插入新模块。
您应该会立即看到结果。