我正在尝试编写一个可以重新启动 NodeJS 服务器的 bash 脚本。这是我使用服务器启动屏幕的方式:
screen -S web-server -d -m node web-server.js
最终结果如下(这意味着它正在工作):
$ ps -Af | grep node
ubuntu 19504 1 0 10:20 ? 00:00:00 SCREEN -S web-server -d -m sudo node web-server.js
root 19506 19504 0 10:20 pts/2 00:00:00 sudo node web-server.js
root 19507 19506 8 10:20 pts/2 00:00:00 node web-server.js
这就是我尝试关闭该服务器的方法:
screen -S web-server -X quit
最终僵尸进程(服务器ppid变为1):
$ ps -Af | grep node
root 19506 1 0 10:20 ? 00:00:00 sudo node web-server.js
root 19507 19506 0 10:20 ? 00:00:00 node web-server.js
我如何终止该屏幕会话,包括其中正在运行的进程?
对于那些可能关心的人 - 我需要在屏幕上使用 sudo 的原因是我在端口 80 上运行服务器,该节点需要超级用户权限。
答案1
因此这似乎是一个可能的解决方案:
screen -list | grep Detached | \
awk '{ print $1 }' | awk -F. '{ if($2=="web-server") print $1 }' | \
xargs sudo pkill -P
如果有人能提出更好的(更干净的)解决方案(而不是寻找屏幕的子进程并杀死它们),我会非常乐意接受这个答案+赞成它。