Alpine环境执行nginx -s reload如何获取正确的Nginx进程PID
关于
nginx -s reload & nginx_pid=$!写法的PID准确性说明 结论:这种写法拿到的nginx_pid完全不是你需要的Nginx服务主进程PID,没有实际运维参考价值。
原因说明
- 首先shell内置变量
$!的作用,是获取当前shell会话中,最近一个被放到后台执行的子进程的PID。你这里加&放到后台的是执行nginx -s reload的临时命令进程,不是常驻提供服务的Nginx主进程。 - 其次
nginx -s reload的运行逻辑根本不会启动新的Nginx服务:它只会读取Nginx的PID文件找到正在运行的主进程,给主进程发送SIGHUP重载信号,信号发完这个临时进程就立刻退出了,你拿到的PID对应的进程存活时间可能只有几毫秒,等你后续要用这个PID做操作的时候,进程早就不存在了。
Alpine容器环境下正确获取Nginx主进程PID的方案
- 优先读Nginx自动生成的PID文件:Alpine软件源安装的官方Nginx包,默认会把主进程PID写到
/run/nginx.pid路径下,直接读取即可,这个值是Nginx主进程启动时自行写入的,准确率100%:
nginx_pid=$(cat /run/nginx.pid)
如果你在nginx.conf里自定义过pid配置项,把路径换成你配置里指定的路径就行。
- 如果PID文件被误删、路径不确定,可以通过进程查询的方式获取,注意要过滤掉Nginx的worker进程,只拿master主进程:
# 用Alpine自带的busybox pidof获取 nginx_pid=$(pidof nginx | awk '{print $1}') # 或者用ps命令过滤主进程 nginx_pid=$(ps | grep "nginx: master process" | grep -v grep | awk '{print $1}')
补充提醒:Docker容器内运行Nginx不建议把服务进程放到后台执行,会导致容器因为没有前台常驻进程直接退出;执行
nginx -s reload的时候也不需要加&放后台,这个命令执行速度极快,前台等待执行完成即可,不会长时间阻塞你的运维脚本。
内容的提问来源于stack exchange,提问作者user19271630
相关产品推荐
相关产品推荐

