进程自动挂起的可能原因有哪些?

进程自动挂起的可能原因有哪些?
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007

我没有点击^Z- 一旦我将其带回前台,该进程就会暂停。我已经没有主意了。造成这种情况的可能原因有哪些?

答案1

SIGTSTP如果有东西向进程发送信号,则进程可以被挂起。这就是 Ctrl-Z 的作用,但信号具有相同的效果。

一些交互式应用程序本身会raise(SIGTSTP)调用自身挂起。这是通过将终端置于原始模式(例如实现编辑)的程序来完成的。例如,当您在 Vim 等文本编辑器中按下 Ctrl-Z 时,TTY 驱动程序不会拦截 Ctrl-Z 来发送信号SIGTSTP。该功能被禁用,因为 TTY 处于原始模式。编辑器收到 Ctrl-Z 并将其解释为暂停命令。该命令的部分操作是将SIGTSTP信号发送到进程本身。

不过,看起来像后台服务器应用程序的东西不太可能执行此类操作。该信号可以来自任何具有权限的进程。

如果进程本身正在向自己发送信号,则从另一个终端窗口对其运行 strace 可以揭示这一点。

strace -p 81104

然后检查哪些系统调用导致它再次挂起。

相关内容