许多年前,我遇到了 Linux 的一个问题,进程会随机进入睡眠状态。当时,我知道/proc
文件系统有一个技巧可以触发进程的唤醒。我隐约记得能够执行类似的操作"echo R" >/proc/pid/stat
,但这似乎不是正确的命令。
互联网上有很多关于“如何唤醒睡眠进程?”的热门话题。很多答案都是“哦,杀掉它吧!”我知道还有另一种方法,但我现在记性不好了。
到目前为止我已经尝试过:
kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
答案1
你所说的“睡觉”是什么意思?
如果你指的是状态S(可中断睡眠),则意味着进程正在等待I/O。该进程当前正在进行阻塞系统调用。你不能强迫它以通用的方式“醒来”——那么它会做什么?当它想要进行的输入或输出操作成为可能时(例如,当数据可供读取时、当写入通道准备好时等)时,它将被唤醒。
如果您指的是状态 T(已停止),则意味着该进程当前已挂起。您可以通过向其发送 CONT 信号 (SIGCONT) 来取消挂起它:kill -CONT PID
进程不会“随机进入睡眠状态”。他们无事可做时就睡觉。如果它们收到阻止它们的信号,它们就会被暂停:SIGTSTP、SIGSTOP、SIGTTIN、SIGTTOU。当后台进程尝试从终端读取(或写入终端)时,最后两个信号由内核中的终端接口发送;如果您没有意识到这一点,您可能会认为该过程随机停止。如果发生这种情况,您需要将其带到前台;在启动后台作业的 shell 中运行fg
,并使用正确的参数来指示该进程所属的作业,例如fg %3
。
stat*
Linux 中的文件是/proc
只读的,我不知道它们何时可写。我不知道你希望在那里写什么。该文件报告的数据是内核管理的数据,其中一些数据或多或少可以由进程直接更改,但不能从外部修改。例如,您无法神奇地使进程变得可运行。
答案2
这取决于进程如何处理信号。如果它没有按照进程想要的方式处理它,则会发生信号的默认操作,有些信号可以被捕获,有些则不能。
我不确定,但你应该看看停止和睡眠进程之间的区别,正如信号手册所说:
Cont Default action is to continue the process if it is currently stopped.
对于睡眠进程来说,它可能是fg
命令。