在 Linux 上,如何在通过发出命令后跟踪阻止系统重新启动的原因sudo reboot
?
我一直认为这会导致切换运行级别并最终重新启动,但现在我被难住了,因为有几次机器在被告知后没有重新启动。
答案1
当我的系统运行不间断进程时,我曾经遇到过这个问题。我们遇到了一个非常糟糕的情况,我们的 Apache 进程似乎正在等待磁盘上的某些内容,并且无法被杀死。
据我所知,当关闭时,Linux 会SIGTERM
向其进程发送 s ,并SIGKILL
在几秒钟后发送给那些敢于不服从的人。然而,如果这些进程处于不可中断状态,内核本身将保护它们:这有助于防止挂起的系统调用涉及 I/O 操作时丢失数据。现在我真的想不出还有什么可以做到的丢弃* a SIGKILL
,因此可以将答案的其他元素带到此处。
* 这是一种相当简化(如果不是错误的话)的查看方式,并且它没有考虑信号异步性。有关这一点的更多详细信息,请参阅吉尔斯的评论。
然而,当涉及到不间断的进程时......
如何在不重新启动的情况下终止不可中断的进程:以某种方式使系统调用终止。通常,在不按下电源开关的情况下执行此操作的最有效方法是拉电源线。您还可以成为内核黑客并让驱动程序使用 TASK_KILLABLE,如中所述LWN 文章。
您可以使用以下命令获取所有正在运行的不间断进程的列表...
$ ps -eo 'state,pid,args' | awk '$1 == "D" {print;}'
$ ps -eo 'state,pid,args' | grep -E '^D'
$ ps -eo 'state,pid,args' | egrep '^D'
...