Команда Bash Run в фоновом режиме внутри подоболочки - PullRequest
0 голосов
/ 31 мая 2018

Я хочу, чтобы я мог включить процесс внутри подоболочки, как если бы он не был внутри подоболочки.

$( sleep 3 & ) просто игнорирует амперсанд.

Я пробовал:

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

но ничего не меняется.

Затем я попытался $( disown sleep 3 & ), что вернуло

disown: не удается манипулировать заданиями в подоболочке

, который заставил меня попробовать $( set -m; disown sleep 3 & ), но я получил тот же вывод.

Я даже пытался создать программу на С ++, которая могла бы демонизировать себя:

#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?

Желательно последняя.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Механизм подстановки команд $(...) ожидает EOF в канале, к которому подключен субоболочка stdout.Таким образом, даже если вы добавили команду в подоболочку, основная оболочка все равно будет ждать ее завершения и закрытия stdout.Чтобы не ждать этого, вам нужно перенаправить вывод с канала.

echo "$( cat file1; sleep 3 >/dev/null & cat file2 )"
0 голосов
/ 31 мая 2018

Надеюсь, я вас правильно понял.Исправьте меня, если я ошибаюсь - вы хотите, чтобы ваш основной поток мог умереть до того, как заканчиваются дочерние потоки?Если это такая ситуация, вы можете использовать detach метод в потоке.

...