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