gpt4 book ai didi

linux - 注销时后台进程 stdout 和 stderr 会发生什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:37 25 4
gpt4 key购买 nike

我试图了解退出 SSH session 时后台进程的 stdout 和 stderr 会发生什么。我了解 SIGHUP、子进程等等,但我对以下内容感到困惑:

如果我运行:(虽然真实;约会; sleep 0.5;完成)|开球 |猫 > 酒吧然后终止 cat 进程然后 tee 进程终止,因为它不能再写入管道。您可以使用 ps 观察这一点。

但是如果我运行:(虽然真实;约会; sleep 0.5;完成)| tee foo & disown并注销我的 SSH session ,我可以观察到一切都“永远”继续运行得很好。因此,即使我的 pty 必须消失,tee 过程的标准输出也必须“继续”。

谁能解释第二个例子中发生了什么?

(是的,我知道我可以显式重定向后台进程的 stdout/stderr/stdin。)

最佳答案

这是关键循环,tee 将输出发送到标准输出并打开文件:

  while (1)
{
bytes_read = read (0, buffer, sizeof buffer);
if (bytes_read < 0 && errno == EINTR)
continue;
if (bytes_read <= 0)
break;

/* Write to all NFILES + 1 descriptors.
Standard output is the first one. */
for (i = 0; i <= nfiles; i++)
if (descriptors[i]
&& fwrite (buffer, bytes_read, 1, descriptors[i]) != 1)
{
error (0, errno, "%s", files[i]);
descriptors[i] = NULL;
ok = false;
}
}

请注意这部分:

        if (descriptors[i]
&& fwrite (buffer, bytes_read, 1, descriptors[i]) != 1)
{
error (0, errno, "%s", files[i]);
descriptors[i] = NULL;
ok = false;
}

它表明当发生错误时,tee 不会自行关闭,只是取消设置文件描述符 descriptors[i] = NULL 并继续读取数据,直到 EOFEINTR 之外的输入错误。

date 命令或任何将输出发送到连接到 tee 的管道的东西都不会终止,因为 tee 仍在读取它们的数据。除了文件 foo 之外,数据不会去任何地方。即使未提供文件参数,tee 仍会读取其数据。

这是 /proc/**/fd 在与终端断开连接时在 tee 上的样子:

0 -> pipe:[431978]
1 -> /dev/pts/2 (deleted)
2 -> /dev/pts/2 (deleted)

这个来自连接到它的管道的进程:

0 -> /dev/pts/2 (deleted)
1 -> pipe:[431978]
2 -> /dev/pts/2 (deleted)

你可以看到 teestdoutstderr 已经 EOL 但它仍在运行。

关于linux - 注销时后台进程 stdout 和 stderr 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25389478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com