Я могу запустить исполняемый файл в фоновом режиме и отсоединить его от терминала с помощью следующих команд:

$ nohup ./executable &

Или

$ ./executable &   
$ disown

Но ничего не работает, если я отправлю аргументы исполняемому файлу:

$ nohup ./executable argument &

Или

$ ./executable argument &
$ disown

Я попытался объединить его с синтаксисом строк и каналов .sh, но он тоже не работает:

$ nohup ./executable <<<$'argument' &

Или

$ ./executable <<<$'argument' &
$ disown

Или

$ nohup echo -e "argument" | ./executable &

Или

$ echo -e "argument" | ./executable &
$ disown

РЕДАКТИРОВАТЬ: Программа «./executable» принимает любое количество параметров, например «./executable arg1 arg2» и т. д. Я думаю, проблема в том, что «&» поглощается «./executable» в качестве параметра. Кроме того, он написан на Go, если это поможет.

0
Azkron 22 Апр 2021 в 12:19
2
Что вы подразумеваете под "не работает"? Это работает в Ubuntu 16 с использованием Bash: nohup sleep 1234 &, а также nohup sleep 1234 &, за которым следует disown.
 – 
berndbausch
22 Апр 2021 в 01:53
Что вы не показали (или даже не заявили), так это то, что исполняемый файл работает с требуемыми аргументами на переднем плане. Ваши попытки обхода показывают, что вы не понимаете разницы между аргументами командной строки и данными стандартного ввода.
 – 
Paul_Pedant
22 Апр 2021 в 10:57
Ваша проблема в другом. Аргументы/параметры действительно передаются программе, даже если она находится в фоновом режиме. Это понятно, потому что ./executable сам по себе является аргументом для nohup, и эта часть работает нормально! Проблема в ./executable: принимает ли он параметры в командной строке? Вы даете ему правильные?
 – 
C. M.
22 Апр 2021 в 11:43
Проблема в том, что когда я запускаю программу с аргументами, за которыми следует «&», программа, кажется, принимает «&» в качестве аргумента, поэтому, если, например, я запускаю «./executable arguments &», программа запустится и запустится вход в консоль, и мне придется остановить его с помощью «ctrl» + «c», чтобы запустить «disown», и он полностью перестанет работать.
 – 
Azkron
22 Апр 2021 в 12:14
Да, программа нормально работает с аргументами, она так устроена. Поэтому, если я запускаю «./executable arguments», он будет работать и начнет регистрироваться в консоли и блокировать ввод, если я не нажму «ctrl» + «c» и не остановлю программу. И да, я немного новичок в Linux и не очень понимаю разницу между stdin и args, я посмотрю на это.
 – 
Azkron
22 Апр 2021 в 12:16

1 ответ

После дополнительного тестирования оказалось, что и $ nohup ./executable &, и $ ./executable & $ disown работают для этих целей. Мне просто нужно прокрутить вниз после запуска top, чтобы увидеть, как программа работает.

В качестве побочного примечания $ nohup ./executable & лучше, если ваша программа начинает ведение журнала немедленно без остановок, так как запуск $ ./executable &, а затем $ disown во время ведения журнала кажется немного странным.

0
agarza 23 Апр 2021 в 13:31