有人能告诉我这是怎么回事吗?据我所知,这些执行 init 脚本的方式是相同的。
box:~# whoami
root
box:~# /etc/init.d/nginx restart
nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
box:~# service nginx restart
nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed
box:~# head -1 /etc/init.d/nginx
#!/bin/sh
box:~# /bin/sh /etc/init.d/nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
我不明白为什么这样做有效,为什么首先存在权限问题。 init 脚本以 root 身份运行,应该可以访问 pid 文件。
更新 1:一些背景信息
我尝试了标准的“权限问题”故障排除方法,甚至将 pid 文件设置为全局可读/可写。之前,我在错误日志中遇到了相同的权限错误,该错误位于自定义位置:在挂载上。我尝试了卸载/重新挂载,但没有成功。之后我使用了“sh”方法,成功了。之后,它似乎使日志权限错误消失,但现在我在 pid 文件上看到了相同的错误(如您所见)。
更新 2:回应评论
box3:~# ls -alZ /var/run/nginx.pid
-rw-rw-rw-. root root unconfined_u:object_r:var_run_t:s0 /var/run/nginx.pid
box3:~# ls -alZ /etc/init.d/nginx
-rwxr-xr-x. root root system_u:object_r:httpd_initrc_exec_t:s0 /etc/init.d/nginx
更新 3:这肯定是 SELinux 的问题
关闭 SELinux 可以解决问题。我需要阅读有关 SELinux 安全上下文的内容。
box:~# setenforce 0
box:~# getenforce
Permissive
box:~# /etc/init.d/nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
box:~# setenforce 1
box:~# /etc/init.d/nginx restart
nginx: [emerg] open() "/mnt1/logs/nginx-error.log" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed