在Linux服务器中,经常会以php-cli
方式运行一些后台服务,例如swoole
, workman
等WebSocket
框架的服务,当这些服务出现了异常要结束或重启时,很多人可能会找不到当时的运行物理路径或物理路径已经不存在了(例如是进入了部署目录里启动的,但因为发布了新版本,所以原来的部署目录文件夹被覆盖或清理,已经不存在了),这样就无法通过常规的方式去停止服务,只能先找到进程id,然后用kill -9 进程ID
的方式来结束。
很多人会首先想到通过使用的端口来查找进程id,常用的命令如:netstat -tunpl | grep 端口号
或lsof -i :端口号
,这样确实能找到当前占用端口的进程ID,但当执行kill -9 进程ID
时发现会提示进程id不存在,再执行netstat -tunpl | grep 端口号
命令会发现,显示出来的端口号确实与上次的不一样了,这是为什么呢?
原来我们所看到的子进程,是由主进程(master,亦称为守护进程)维护的,所以要达到停止进程的目的,要找到主进程的id,再执行kill命令,就能彻底结束掉这个服务了,具体怎么做呢?
可以使用查找进程的命令:ps -aux | grep php
,系统会列出当前所有的php进程,如下图所示:
其中有一列会详细列出进程类型(master)及cli进程的启动文件,这个非常有用,能快速地根据启动目录和文件名找到我们想找的服务,然后调用 kill -9 进程ID
,就能将服务彻底结束掉了。