使用 Vista 计算机上的 Putty,我登录到开发服务器 (Ubuntu) 并启动 Django 测试服务器。它运行类似 Apache 的服务器来测试我的 Web 应用程序。该应用程序在我的内部 IP 地址上运行,端口为 8080。我可以通过 Web 浏览器打开它,然后导航到192.168.0.130:8080
。
我离开电脑一段时间(物理上),回来后发现 Putty 连接超时了。没什么大不了的,我只是重新登录服务器。但是,当我现在尝试运行 Django 测试服务器时,它显示端口已在使用中。这意味着(我认为)第一个测试服务器实例仍在端口 8080 上运行。
我该如何终止此进程?该进程是什么样子的?我做了一个ps aux
,感觉这是有问题的进程:
garfonzo 5719 0.3 0.0 0 0 ? D 08:58 1:07 [python]
因为我今天早上那个时候启动了服务器,而且 Django 是基于 Python 的。但是,执行此kill 5719
操作没有任何效果——进程没有被终止,我仍然无法启动测试服务器。
有任何想法吗!?
编辑- 更多细节:
我也运行了netstat -tulpn
,输出如下:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.1.130:8080 0.0.0.0:* LISTEN -
这不是很方便吗,我想知道进程 ID 的那个端口没有 PID!
答案1
如果你非常确信这是正确的过程(这似乎是可能的) - 并且由于 netstat 没有告诉你任何有用的信息,那么你可以使用
kill -9 5719
-9 开关发送 SIGKILL 而不是默认的 SIGTERM 信号,如果进程可停止,它将停止该进程。
SIGTERM 信号被发送给进程,并有效地要求其关闭。进程可以选择捕获 SIGTERM 并执行其他完全不同的操作。
另一方面,SIGKILL 信号不会发送给进程,因此无法忽略。内核会立即终止进程,因此只能将其作为最后的手段,因为它不会为进程提供清理的机会。
如果进程的 I/O 阻塞,那么它可能无法通过 SIGKILL 停止,在这种情况下它是一个僵尸进程,可能需要重新启动才能清除它。
详细说明:如果一个进程正在等待 I/O,则不能将其终止,因为这样做会为执行所述 I/O 的内核函数留下一个悬空的回调。
或者,如果进程的父进程不调用wait
,则该进程将保持为僵尸进程。有关死进程的一个很好的摘要位于http://www.linuxsa.org.au/tips/zombies.html。
ps 中出现的这些僵尸进程是什么?我杀死了它们,但它们没有消失!
僵尸进程是死进程。您无法杀死死进程。所有进程最终都会死亡,当它们死亡时,它们就会变成僵尸进程。它们几乎不消耗任何资源,这是意料之中的,因为它们已经死了!僵尸进程存在的原因在于,僵尸进程的父进程(进程)可以检索僵尸进程的退出状态和资源使用情况统计信息。父进程使用 wait() 系统调用之一向操作系统发出信号,表示它不再需要僵尸进程。
当一个进程死亡时,它的子进程都会成为 1 号进程(即 init 进程)的子进程。Init 总是在等待子进程死亡,这样它们就不会一直处于僵尸状态。
如果您有僵尸进程,则意味着这些僵尸进程的父进程没有等待它们(查看 ps -l 显示的 PPID)。您有三个选择:修复父进程(让其等待);终止父进程;或者忍受它。请记住,忍受它并不难,因为僵尸进程在 ps 的输出中只占用一行多一点的内容。