假设我有一个长时间运行的进程,long_running_proc
有一个到主机的 TCP 连接host.example.com
。
当该进程作为前台进程与后台进程或后台进程运行时,操作系统或 shell 是否会以不同方式对待该进程screen
?
例如:
~ long_running_proc --connect host.example.com
...
与
~ screen
~ long_running_proc --connect host.example.com
[ctrl-a] + d
~
与
~ long_running_proc --connect host.example.com &
[1] 67539
~
是否有不同的规则来处理中断或上下文切换?他们的优先级较低吗?我是否更有可能通过屏蔽/后台进程获得 TCP 超时?
答案1
一般来说,通过默认唯一的区别是,如果它在后台尝试读取(或写入)tty,它将收到 SIGTTIN(或 SIGTTOU)信号。
关于优先级或更高上下文切换的其他差异取决于您的 shell(或screen
)是否愿意执行此类操作,例如更改进程的“nice”编号或可能将其绑定到一个特定的 CPU,以及该 CPU 是否碰巧被中断很多。通常除非有要求,shell 不会执行此类操作。
TCP 超时的较高概率可能与您的进程是否做被上述信号之一阻止(由于尝试 tty 访问),在这种情况下,它将没有任何机会接收并因此回复网络流量。
如果您仔细想想,守护进程可能是最“后台”的进程,而且它们当然不是二等进程。
我无法确切地了解具体的screen
分离操作,但其文档表明分离的进程继续运行,并且screen
分离本身来自进程的 tty,因此该进程基本上继续进行,与正常的前台或后台操作没有区别。但是,由于交互式终端与进程的虚拟终端分离,因此向它发出命令会遇到困难。如果您的进程在某些时候需要来自终端的输入,这可能对您的进程不利。