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
然后检查哪些系统调用导致它再次挂起。