如果普通用户执行
service redis-server status
即使redis-server 已经运行了还是显示以下内容
redis-server is not running
如果换成用root 用户或用sudo 执行
sudo service redis-server status
就能显示出正确的redis-server 状态了
redis-server is running
原来service 命令也是个shell 脚本
which service
/usr/sbin/service
查看service 的内容
vi $(which service)
可以看到SERVICEDIR="/etc/init.d",所以
service redis-server status
等同于
/etc/init.d/redis-server status
实际上,/etc/init.d/redis-server 也是个shell 脚本
vi /etc/init.d/redis-server
原来该脚本通过以下命令判断redis-server 是否存在
start-stop-daemon --stop --quiet --signal 0 --name ${NAME} --pidfile ${PIDFILE}
变量定义如下
NAME=redis-server
RUNDIR=/var/run/redis
PIDFILE=$RUNDIR/redis-server.pid
替换变量,去掉--quiet 参数后,分别用
普通用户执行
start-stop-daemon --stop --signal 0 --name redis-server --pidfile /var/run/redis/redis-server.pid
1 pids were not killed
No redis-server found running; none killed.
echo $?
1
用root 或sudo 执行
sudo start-stop-daemon --stop --signal 0 --name redis-server --pidfile /var/run/redis/redis-server.pid
echo $?
0
究其原因,还是权限问题,虽然信号0 表示什么也不做,但start-stop-daemon --stop 还是要去假装执行停止动作
但是如果你的权限不够,连假装的机会都没有,直接用普通用户执行kill -0 可以看到类似的效果
kill -0 $(cat /var/run/redis/redis-server.pid)
-bash: kill: (4180) - Operation not permitted
换成sudo 或root 执行
sudo kill -0 $(cat /var/run/redis/redis-server.pid)
/tmp$ echo $?
0
建议,以后执行service 命令时还是用sudo 或root 得到的结果才比较正确
ubuntu 14.04 安装redis
https://www.jianshu.com/p/9c027f7a89e6
start-stop-daemon 命令
https://www.cnblogs.com/qq78292959/p/3634552.html
linux service 命令解析
https://www.cnblogs.com/zejin2008/p/5810768.html
Linux 使用KILL 0 检测进程是否存在
https://typecodes.com/cseries/kill0checkprocessifexist.html