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