niginx的启动错误,关于PID

nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument

在使用systemctl status nginx的时候,发现有一行这样的错误报告。
意思是systemd没有读到nginx的PID,这个很奇怪。
应该用systemctl restart nginx就可以解决了。发现还是不行。

深入研究结果如下:
每一个被systemctl控制的服务,具体如何被systemctl控制,比如如何start,如何stop,等等,都放在该服务的一个配置文件里面。这个配置文件放在/lib/systemd/system目录,也可能在/etc/systemd/system目录。
不用每个文件去找,我们可以用 “systemctl cat 服务名称” 的命令来看配置文件。比如看nginx的配置文件:
systemctl cat nginx
输出结果如下:

# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

期中就看到了我们错误信息中的内容:
[Service]
PIDFile=/run/nginx.pid
也就是说systemctl按照这个文件读取PID的。但读取的过程中,没有nginx.pid。
另外
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'这一行,表示如何让systemctl来执行启动的,就是ExecStart的参数。也就是说systemctl start nginx的指令,实际执行的是上面一行的指令。
错误产生的可能的情况是:
systemctl执行ExecStart,实际就是执行/usr/sbin/nginx -g 'daemon on; master_process on;
然后就读PID,但有可能上面的命令还没执行完,所以读不到pid。

解决办法

参考网上内容,在该[Service]那一段里,最后加一行:

ExecStartPost=/bin/sleep 0.1

意思是systemctl在执行ExecStart后睡0.1秒,再开始干活。当然也可以0.2,只要别睡过头就可以。

如果你怕自己修改配置文件有问题,可以参考如下方法:
方法 一

  1. 建立目录
    mkdir -p /etc/systemd/system/nginx.service.d
    2.在新建目录中建立文件override.conf
    touch override.conf
    3.用vi override.conf在override.conf中输入内容:
    [Service]
    ExecStartPost=/bin/sleep 0.1

方法 二
mkdir /etc/systemd/system/nginx.service.d
printf “[Service]\nExecStartPost=/bin/sleep 0.1\n” > /etc/systemd/system/nginx.service.d/override.conf

最后的必要步骤

改完这个配置文件后,需要重新启动一下systemctl
systemctl daemon-reload
systemctl restart nginx.service
之后发现没有错误报告了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值