小编Gly*_*yph的帖子

进程在后台启动之前被杀死

我正在使用一个script.sh包含命令的 bash 脚本cmd,在后台启动:

#!/bin/bash
…
cmd &
…
Run Code Online (Sandbox Code Playgroud)

如果我打开终端模拟器并运行script.sh,cmd会按预期在后台正确执行。即,whilescript.sh已结束,cmd继续在后台运行,PPID 为 1。

但是,如果我打开另一个终端仿真程序(让说的xfce4终端)从以前的一个(或在桌面会话的开始,这是我的真实使用情况下),并执行script.sh

xfce4-terminal -H -x script.sh
Run Code Online (Sandbox Code Playgroud)

cmd不再正确执行:它被终止script.sh。使用nohup来防止这种情况是不够的。我必须sleep在它之后放一个命令,否则在与它分离之前被cmd终止script.sh

我发现,做的唯一途径cmd背景正确执行是把set -mscript.sh。为什么在这种情况下是必要的,而不是第一个?为什么这两种执行方式script.sh(以及因此cmd)之间的行为存在差异?

我认为,在第一种情况下,监控模式激活,如一个可以通过将看到set -oscript.sh

shell terminal-emulator job-control background-process xfce4-terminal

6
推荐指数
1
解决办法
574
查看次数

使用 tee 处理替换和重定向

假设您在 bash 中将命令的标准输出重定向cmd到名为 的文件f.out,并将标准错误重定向到f.errtee用于保留控制台打印:

cmd 1> >(tee f.out) 2> >(tee f.err)
Run Code Online (Sandbox Code Playgroud)

然后f.out包含输出以及错误(至少在我的系统上)。

现在,如果您更改重定向的顺序:

cmd 2> >(tee f.err) 1> >(tee f.out)
Run Code Online (Sandbox Code Playgroud)

f.out只包含输出(并且f.err只包含两种情况下的错误)。

所以我的问题是双重的:如何将 stderr 重定向到f.out,以及为什么重定向的顺序会影响结果?

请注意,如果您不使用tee, 但例如cat,如下所示:

cmd 1> >(cat>f.out) 2> >(cat>f.err)
Run Code Online (Sandbox Code Playgroud)

你没有这个问题,重定向的顺序并不重要,正如预期的那样,就像没有进程替换 ( cmd 1>f.out 2>f.err) 的情况一样。

bash io-redirection process-substitution tee

6
推荐指数
1
解决办法
734
查看次数