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 ...]
.
Jestexec
moż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.