被取消并失去终端的流程的输出会发生什么?


26

如果我关闭启动了某些过程的虚拟终端,输出是否直接进入/dev/null,或者会以某种方式污染内存? 在那之后的任何时候,我都可以获取输出以继续读取它吗?

[EDIT]:那么,放弃进程的那一刻是否有效地结束了我控制其输出的能力?

我还注意到,如果我放弃一个已停止的进程,起初一切似乎都很正常:它既不终止也不在作业中显示。但是,如果我注销(并且我不是要关闭终端,su例如,从退出),则该过程将终止。一样,后台运行的独立进程可以保持运行。


2
对于“我能以任何方式获取输出”:不是没有肮脏的把戏。但是,请参阅如何取消正在运行的进程并将其关联到新的屏幕外壳?以及其他引用的肮脏技巧问题(全部基于将调试器附加到程序并以某种方式使其打开不同的输出文件)。
吉尔斯(Gilles)'所以

感谢您链接到该问题。到目前为止,它给了我最好的答案!特别是聪明的retty程序。
rozcietrzewiacz 2011年

1
另请参阅有关相关问题的答案
斯蒂芬·吉梅内斯

Answers:


11

流程“被取消”的事实仅对创建此流程的交互式外壳有意义。这意味着外壳程序不再在其Jobs表中包括(不再)该进程,并且在外壳程序退出时,SIGHUP将不会发送到该进程。它与您的问题并没有真正的关系。

关于发送到已删除的虚拟终端的输出发生了什么:我自己进行了一些测试,我注意到/dev/pts/x设备不可访问,并且在指向它们的所有文件描述符都已关闭之前,不会再次分配设备。因此,我看不到为什么要存储对已删除终端的写入的原因。我想这甚至不是POSIX定义的。

关于获取写入终端的某些过程的输出,即使终端仍然存在,我也不可能¹。您所能做的就是获取到终端的直接输入(即,击键或pty的主控部分模拟击键)。如果进程将在stdin上读取写入其终端的内容,则将导致大多数进程的自io循环。

关于进程终止的最后一句话,我真的不知道发生了什么,但是我怀疑当会话时,与进程组的前台/后台状态相关的信号(SIGTTOU,SIGTTIN,SIGHUP或其他)的行为很奇怪。领导者退出(例如su您提到的情况)。

编辑的回答否,关于输出,当取消进程时,什么都不会改变:它仍附加在其控制终端上(除非它已经像守护程序一样已经脱离了自身)。您可以使用查看ps。但是,您将无法使用fg/ bg/ jobs由壳这一过程提供了命令。这意味着可能很难从终端(需要在前台进程组中)输入信息。


1.除非该进程愿意或被某些调试工具劫持(请参阅上面的注释)。


1
感谢您澄清这一点。实际上,放弃流程的事实仍然与我的问题有关:放弃流程后,我似乎失去了控制其输出的能力,对吗?(即使终端已经关闭。)我将编辑问题以包括该案例。
rozcietrzewiacz 2011年

4

只是为了解决这个特定问题:

如果我关闭启动了某些进程的虚拟终端,输出是否直接进入/ dev / null,还是会以某种方式污染内存?

终端和与其相连的程序通过tty设备像文件一样读写来进行通信。具体来说,虚拟终端会创建一个“ pseudo-tty”(简称“ pty”),然后生成一个shell(或其他)进程,并将该进程的stdin / out / err连接到pty。(详细信息因操作系统而异。)

当您关闭虚拟终端时,虚拟终端将关闭其连接末端(pty“ master”)。之后,如果连接另一端的程序写入tty,则会返回错误,并且数据不会在任何地方。同样,如果它从tty中读取,它将返回EOF(文件结束)指示符。


谢谢-从更多的编程角度来看,很好的解释。
rozcietrzewiacz 2011年


0

感谢吉尔(Gilles)的评论,使我指出了这个问题,我了解了一个名为retty的程序。

它似乎使用了一些肮脏的技巧来有效地附加到(伪)tty,从而允许继续读取进程的输出-不管是否已取消该进程的输出。因此,这似乎可以回答我问题的第一部分的大部分内容。第二个回答是斯特凡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.