Sto cercando di scrivere uno script shell di Linux (preferibilmente bash), presumibilmente chiamato detach.sh
, per staccare in modo sicuro i programmi da un terminale, tale che:Su scrivere uno script shell di Linux per staccare in modo sicuro i programmi da un terminale
Invocazione:
./detach.sh prog [arg1 arg2 ...]
.È
exec
-abile, ad es. eseguendo questo nella shell:exec ./detach.sh prog [arg1 arg2 ...]
Con una corretta citando (manipolazione principalmente di argomenti contenenti spazi bianchi).
Scarta le uscite (poiché non sono necessarie).
Vuol Non utilizzare
screen
,tmux
, ecc (stessa ragione con 4, più alcuna necessità di un processo di babysitting extra).Utilizza (ragionevolmente) comandi e programmi portatili, e non cose come
start-stop-daemon
che è piuttosto distro-specifico.
ho pensato a diversi modi (linee Shebang #!/bin/bash
trascurati per il bene di brevità):
nohup
:nohup "[email protected]" >& /dev/null &
disown
:"[email protected]" >& /dev/null & disown
setsid
:setsid "[email protected]" >& /dev/null &
Utilizzando una subshell:
("[email protected]" >& /dev/null &)
nohup
/setsid
combinato con subshell:# Or alternatively: # (nohup "[email protected]" >& /dev/null &) (setsid "[email protected]" >& /dev/null &)
Quando si utilizza gedit
come il programma di test (sostituendo la parte "[email protected]"
), condizione 1 può essere soddisfatto con tutti i metodi sopra, ma la condizione 2 può essere soddisfatta con nessuno.
Tuttavia, se un programma arbitrario (ma non una shell incorporata) viene aggiunto allo script 5, , tutte le condizioni sembrano essere soddisfatte (almeno per me nel caso gedit
). Per esempio:
(setsid "[email protected]" >& /dev/null &)
# Not just `true' because it is also a shell builtin.
/bin/true
Chiunque abbia un'idea su una spiegazione dei fenomeni di cui sopra e come implementare correttamente i requisiti?
EDIT:
Con condizione 2, intendo il programma deve essere staccato dal terminale, ma funziona come al solito altrimenti. Ad esempio, con il caso gedit
, la condizione non riesce se si chiude immediatamente subito dopo che il processo dello script è terminato.
In che modo la soluzione 5 non soddisfa il requisito 2, a patto di avere la baracca ? O, all'incirca in modo equivalente, che cosa significa il requisito 2 che non è soddisfatto dalla soluzione 5? –
Cosa ti aspetti che succeda quando 'gedit' viene eseguito in background? Poiché 'gedit' è un editor che funziona in modo interattivo, ma un processo in background è, più o meno per definizione, qualcosa che funziona senza interazione dell'utente, forse il problema è la scelta del programma di test. La gestione dei programmi basati su X11 è piuttosto diversa dalla gestione di compilatori e simili. Cosa vedi quando esegui 'gedit' in background? –
Ci scusiamo per la spiegazione errata della mia idea. Intendevo "staccare" quando dicevo "sfondo". Si prega di consultare la versione aggiornata di questa domanda. Grazie per il tuo aiuto :) –