我希望能够在子shell中像不在子shell中一样启动一个进程。
$( sleep 3 & )
只是忽略了&符号。
我尝试过:
$( sleep 3 & )
$( sleep 3 & ) &
$( sleep 3 ) &
但是什么都没有改变。
然后我尝试了$( disown sleep 3 & )
,结果返回:
disown: 无法在子shell中操作作业
这让我尝试使用$( 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
,子shell仍然会等待进程结束。
为了排除我的MCVE,从子shell调用一个函数,在该函数中,我需要从服务器获取数据并在后台运行。我的唯一限制是不能编辑子shell中的函数调用。
有没有办法在C++程序中不使用fork而是从父进程中分离出来以便可以无影响地结束或强制命令从子shell中分离出来在bash中执行?
最好是后者。
$(...)
用于运行命令并将其输出放入当前shell命令中。如果你在后台运行该命令,如何捕获其输出? - Barmar