Bash 运行 命令在后台子 shell 中
Bash run command in background inside subshell
我希望能够在子 shell 中 bg 进程,就好像它不在子 shell 中一样。
$( sleep 3 & )
只是忽略了符号。
我试过:
$( sleep 3 & )
$( sleep 3 & ) &
$( sleep 3 ) &
但没有任何变化。
然后我尝试 $( disown sleep 3 & )
结果返回
disown: can't manipulate jobs in 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;
}
但是在 运行ning 之后,意识到因为我正在 fork
ing 而不是 separate_from_parent_and_let_parent_die
ing 子 shell 仍然会等待进程结束。
为了跳出我的 MCVE,正在从子 shell 调用一个函数,在该函数中,我需要从服务器提取数据并且它需要在 bg 中 运行。我唯一的限制是我无法在子 shell 中编辑函数调用。
在 C++ 程序中,有什么方法可以不分叉而是与父进程分离,这样它就可以死掉而不会产生任何后果,或者强制命令与 bash 中的子 shell 分离?
最好是后者。
希望我没听错。如果我错了,请修复我——你希望你的主线程能够在子线程结束之前死掉吗?
如果是这种情况,您可以在线程上使用 detach
方法。
$(...)
命令替换机制等待 subshell 的 stdout
连接到的管道上的 EOF。因此,即使您在 subshell 中后台执行命令,main shell 仍将等待它完成并关闭其 stdout
。为避免等待,您需要将其输出重定向到管道之外。
echo "$( cat file1; sleep 3 >/dev/null & cat file2 )"
我希望能够在子 shell 中 bg 进程,就好像它不在子 shell 中一样。
$( sleep 3 & )
只是忽略了符号。
我试过:
$( sleep 3 & )
$( sleep 3 & ) &
$( sleep 3 ) &
但没有任何变化。
然后我尝试 $( disown sleep 3 & )
结果返回
disown: can't manipulate jobs in 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;
}
但是在 运行ning 之后,意识到因为我正在 fork
ing 而不是 separate_from_parent_and_let_parent_die
ing 子 shell 仍然会等待进程结束。
为了跳出我的 MCVE,正在从子 shell 调用一个函数,在该函数中,我需要从服务器提取数据并且它需要在 bg 中 运行。我唯一的限制是我无法在子 shell 中编辑函数调用。
在 C++ 程序中,有什么方法可以不分叉而是与父进程分离,这样它就可以死掉而不会产生任何后果,或者强制命令与 bash 中的子 shell 分离?
最好是后者。
希望我没听错。如果我错了,请修复我——你希望你的主线程能够在子线程结束之前死掉吗?
如果是这种情况,您可以在线程上使用 detach
方法。
$(...)
命令替换机制等待 subshell 的 stdout
连接到的管道上的 EOF。因此,即使您在 subshell 中后台执行命令,main shell 仍将等待它完成并关闭其 stdout
。为避免等待,您需要将其输出重定向到管道之外。
echo "$( cat file1; sleep 3 >/dev/null & cat file2 )"