Pisząc skrypt powłoki Linuksa, aby bezpiecznie odłączyć programy od terminala

Próbuję napisać skrypt powłoki Linuksa (najlepiej bash), rzekomo nazwanydetach.sh, aby bezpiecznie odłączyć programy od terminala, tak aby:

Wezwanie:./detach.sh prog [arg1 arg2 ...].

Jestexecmożliwe, np. uruchamiając to w powłoce:

<code>exec ./detach.sh prog [arg1 arg2 ...]
</code>

Z odpowiednim cytowaniem (głównie obsługa argumentów zawierających białe znaki).

Odrzuca wyjścia (ponieważ są niepotrzebne).

Nie używascreen, tmux, itp. (ten sam powód z 4, plus brak potrzeby dodatkowego procesu opieki nad dziećmi).

Używa (rozsądnie) przenośnych poleceń i programów, i nie ma takich rzeczystart-stop-daemon co jest dość specyficzne.

Pomyślałem o kilku sposobach (linie shebang#!/bin/bash zaniedbany ze względu na zwięzłość):

nohup:

<code>nohup "$@" >& /dev/null &
</code>

disown:

<code>"$@" >& /dev/null &
disown
</code>

setsid:

<code>setsid "$@" >& /dev/null &
</code>

Korzystanie z podpowłoki:

<code>("$@" >& /dev/null &)
</code>

nohup/setsid połączone z podpowłoką:

<code># Or alternatively:
# (nohup "$@" >& /dev/null &)
(setsid "$@" >& /dev/null &)
</code>

Podczas używaniagedit jako program testowy (zastępujący"$@" część), warunek 1 może być spełniony z wszystkimi powyższymi metodami, ale warunek 2 może być spełniony bez żadnego.

Jeśli jednak do skryptu 5 zostanie dodany dowolny program (ale nie wbudowany shell), wszystkie warunki wydają się być spełnione (przynajmniej dla mnie wgedit walizka). Na przykład:

<code>(setsid "$@" >& /dev/null &)
# Not just `true' because it is also a shell builtin.
/bin/true
</code>

Każdy, kto ma pomysł na wyjaśnienie powyższych zjawisk i jak poprawnie wdrożyć wymagania?

EDYTOWAĆ:

W przypadku warunku 2 mam na myśli, że program powinien zostać odłączony od terminala, ale działa jak zwykle. Na przykład zgedit jeśli warunek się nie powiedziegedit kończy się zaraz po zakończeniu procesu skryptu.

questionAnswers(3)

yourAnswerToTheQuestion