Bash run 命令在子壳的后台运行

Bash run command in background inside subshell

本文关键字:后台 运行 run 命令 Bash      更新时间:2023-10-16

我希望能够在子外壳内对进程进行bg,就好像它不在子外壳中一样。

$( sleep 3 & )只是忽略了与号。

我试过:

$( sleep 3 & )
$( sleep 3 & ) &
$( sleep 3 ) &

但没有任何变化。

然后我尝试了返回$( disown sleep 3 & )

放弃:无法在 Subshell 中操作作业

这导致我尝试$( set -m; disown sleep 3 & )但我得到了相同的输出。

我甚至尝试创建一个 c++ 程序来守护自己:

#include <unistd.h>
#include <chrono>
#include <thread>
using namespace std;
int main() {
int ret = fork();
if (ret < 0) return ret;  // fork error
if (ret > 0) return 0;  // parent exits
this_thread::sleep_for(chrono::milliseconds(3000));
return 0;
}

但是在运行它之后,意识到因为我正在fork而不是separate_from_parent_and_let_parent_die子壳仍然会等待该过程结束。

要走出我的 MCVE,正在从子外壳调用一个函数,在该函数中,我需要从服务器中提取数据,并且需要在 bg 中运行。我唯一的限制是我无法在子外壳中编辑函数调用。

有没有办法不分叉而是与 c++ 程序中的父进程分离,以便它可以在没有后果的情况下死亡或强制命令与 bash 中的子 shell 分离?

最好是后者。

$(...)命令替换机制在子外壳的stdout连接到的管道上等待 EOF。因此,即使您在子外壳中后台设置命令,主外壳仍将等待它完成并关闭其stdout。为了避免等待这种情况,您需要将其输出重定向到远离管道的位置。

echo "$( cat file1; sleep 3 >/dev/null & cat file2 )"

我希望我说得对。如果我错了,请修复我 - 您希望您的主线程能够在子线程结束之前死亡? 我 f 这是您可以在线程上使用detach方法的情况。