如果我关闭启动了某些过程的虚拟终端,输出是否直接进入/dev/null
,或者会以某种方式污染内存?
在那之后的任何时候,我都可以获取输出以继续读取它吗?
[EDIT]:那么,放弃进程的那一刻是否有效地结束了我控制其输出的能力?
我还注意到,如果我放弃一个已停止的进程,起初一切似乎都很正常:它既不终止也不在作业中显示。但是,如果我注销(并且我不是要关闭终端,su
例如,从退出),则该过程将终止。一样,后台运行的独立进程可以保持运行。
retty
程序。
如果我关闭启动了某些过程的虚拟终端,输出是否直接进入/dev/null
,或者会以某种方式污染内存?
在那之后的任何时候,我都可以获取输出以继续读取它吗?
[EDIT]:那么,放弃进程的那一刻是否有效地结束了我控制其输出的能力?
我还注意到,如果我放弃一个已停止的进程,起初一切似乎都很正常:它既不终止也不在作业中显示。但是,如果我注销(并且我不是要关闭终端,su
例如,从退出),则该过程将终止。一样,后台运行的独立进程可以保持运行。
retty
程序。
Answers:
流程“被取消”的事实仅对创建此流程的交互式外壳有意义。这意味着外壳程序不再在其Jobs表中包括(不再)该进程,并且在外壳程序退出时,SIGHUP将不会发送到该进程。它与您的问题并没有真正的关系。
关于发送到已删除的虚拟终端的输出发生了什么:我自己进行了一些测试,我注意到/dev/pts/x
设备不可访问,并且在指向它们的所有文件描述符都已关闭之前,不会再次分配设备。因此,我看不到为什么要存储对已删除终端的写入的原因。我想这甚至不是POSIX定义的。
关于获取写入终端的某些过程的输出,即使终端仍然存在,我也不可能¹。您所能做的就是获取到终端的直接输入(即,击键或pty的主控部分模拟击键)。如果进程将在stdin上读取写入其终端的内容,则将导致大多数进程的自io循环。
关于进程终止的最后一句话,我真的不知道发生了什么,但是我怀疑当会话时,与进程组的前台/后台状态相关的信号(SIGTTOU,SIGTTIN,SIGHUP或其他)的行为很奇怪。领导者退出(例如su
您提到的情况)。
编辑的回答:否,关于输出,当取消进程时,什么都不会改变:它仍附加在其控制终端上(除非它已经像守护程序一样已经脱离了自身)。您可以使用查看ps
。但是,您将无法使用fg
/ bg
/ jobs
由壳这一过程提供了命令。这意味着可能很难从终端(需要在前台进程组中)输入信息。
—
1.除非该进程愿意或被某些调试工具劫持(请参阅上面的注释)。
只是为了解决这个特定问题:
如果我关闭启动了某些进程的虚拟终端,输出是否直接进入/ dev / null,还是会以某种方式污染内存?
终端和与其相连的程序通过tty设备像文件一样读写来进行通信。具体来说,虚拟终端会创建一个“ pseudo-tty”(简称“ pty”),然后生成一个shell(或其他)进程,并将该进程的stdin / out / err连接到pty。(详细信息因操作系统而异。)
当您关闭虚拟终端时,虚拟终端将关闭其连接末端(pty“ master”)。之后,如果连接另一端的程序写入tty,则会返回错误,并且数据不会在任何地方。同样,如果它从tty中读取,它将返回EOF(文件结束)指示符。
要回答问题中最有趣的部分:要更改正在运行的程序的输出,必须编辑其文件描述符。使用gdb相当容易。这是一个hack,但可以。
看到:
/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line