是我误解了什么吗,还是这不可能?
在我尝试停止控制服务后,我的所有守护进程都处于僵尸状态:
# ps ax | grep controller
13768 pts/11 S+ 0:00 grep controller
26866 ? Zl 18:56 [controller] <defunct>
26870 ? Zl 18:57 [controller] <defunct>
26871 ? Zl 18:45 [controller] <defunct>
26876 ? Zl 13:17 [controller] <defunct>
26877 ? Zl 10:28 [controller] <defunct>
26880 ? Zl 18:18 [controller] <defunct>
26881 ? Zl 12:01 [controller] <defunct>
26882 ? Zl 18:18 [controller] <defunct>
但端口仍然打开(虽然 netstat 找不到进程名称)
# netstat -tlpn | sort
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1180/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11882/httpd
tcp 0 0 10.0.0.50:8890 0.0.0.0:* LISTEN -
tcp 0 0 10.0.0.50:8891 0.0.0.0:* LISTEN -
tcp 0 0 10.0.0.50:8892 0.0.0.0:* LISTEN -
tcp 0 0 10.0.0.50:8896 0.0.0.0:* LISTEN -
tcp 0 0 10.0.0.50:8897 0.0.0.0:* LISTEN -
tcp 0 0 10.0.0.50:8900 0.0.0.0:* LISTEN -
尽管 lsof能查看进程名称
# lsof -i -n -P | grep 10.0.0.50 | grep LISTEN
controlle 26866 devuser 82u IPv4 323641 0t0 TCP 10.0.0.50:8890 (LISTEN)
controlle 26870 devuser 82u IPv4 323629 0t0 TCP 10.0.0.50:8891 (LISTEN)
controlle 26871 devuser 82u IPv4 323635 0t0 TCP 10.0.0.50:8892 (LISTEN)
controlle 26876 devuser 82u IPv4 323643 0t0 TCP 10.0.0.50:8896 (LISTEN)
controlle 26877 devuser 82u IPv4 323615 0t0 TCP 10.0.0.50:8897 (LISTEN)
controlle 26880 devuser 82u IPv4 323647 0t0 TCP 10.0.0.50:8900 (LISTEN)
controlle 26881 devuser 82u IPv4 323649 0t0 TCP 10.0.0.50:8901 (LISTEN)
controlle 26882 devuser 82u IPv4 323631 0t0 TCP 10.0.0.50:8902 (LISTEN)
最奇怪的是,这些僵尸进程似乎运行良好:
# curl http://10.0.0.50:8892/status
{"status": "ok"}
但是kill
让它们停止的进程(我需要升级它们,因此首先尝试停止它们)没有任何效果。
我可能需要重新启动来终止进程以便升级它们,但最好先弄清楚这里发生了什么,以及无敌的运行死亡进程......
答案1
kill -9
将会消灭那些僵尸。
通常,僵尸进程发生在父进程死亡且子进程在父进程退出前没有被正确关闭时。如果父进程kill
没有正常关闭(并带走所有子进程),则这种情况更常发生。这类似于孤儿进程。
答案2
在进程退出和父进程获得退出状态之间的时间内,进程是僵尸进程。如果僵尸进程停留很长时间,则表明该僵尸进程的父进程存在缺陷。如果父进程死亡,则进程号 1(init 进程)将继承该进程。init 应该总是能够快速处理僵尸进程。如果您看到父进程 pid 为 1 的僵尸进程,则表明 init 或内核存在问题。