Sul desktop con Bash, dovrei usare ' & ', nohup, disown, o una combinazione dei tre per avviare un processo e farlo funzionare completamente da solo?

Quando eseguo questi quattro comandi su Xubuntu 16.04, localmente o tramite ssh, sembrano tutti fare esattamente la stessa cosa:

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally 
  1. gedit & 
  2. gedit & disown 
  3. nohup gedit 
  4. nohup gedit & disown 

Non lo so ottieni la differenza tra gedit & e gedit & disown perché se uccido il terminale genitore o esco da una sessione ssh, sembrerebbe che gedit è “rinnegato” in entrambi gli scenari.

Per quanto riguarda due e tre, lunica differenza che vedo è che loutput del comando viene registrato in un file separato e continuerà a essere registrato in quel registro separato anche se la sessione di shell originale che ha generato il processo bg viene interrotta.

Per quanto riguarda tre e quattro, continuo a leggere che cè una differenza tecnica, ma non riesco a capire perché dovresti preferire uno rispetto allaltro.

Quale dovrei usare? Ho visto tutti e quattro i comandi utilizzati nei tutorial e Q & As, e nonostante alcune risposte davvero ottime che descrivono le differenze tecniche tra nohup e disown, non riesco a ottenere una chiara raccomandazione (tranne forse per scopi di registrazione o compatibilità con la shell) per quale dovrei usare.

Commenti

  • Hai bisogno di & in tutti i casi in cui vuoi continuare nella shell (e il programma non esegue il fork da solo). Potrebbe non essere necessario nohup per i programmi che chiudono i descrittori di file e si dissociano (questo vale per la maggior parte delle applicazioni GUI). Puoi usare disown dopo il fatto (se non dimentichi nohup) e come scritto prima che le app GUI non ne abbiano bisogno.

Rispondi

Quando devo eseguire uno script che verrà eseguito per un lungo , e io” m on una ssh sessione, desidero:

  1. Lattività dovrebbe continuare anche quando la rete si interrompe o quando impacco il laptop e me ne vado .

    a. Lattività può terminare senza il mio intervento interattivo.

     nohup do_my_stuff & 

    b. Lattività potrebbe richiedere qualcosa da me su stdin .

     man tmux history -w tmux do_my_stuff 
  2. Il processo in background in qualche modo migliora la mia sessione corrente e dovrebbe morire insieme alla sessione. Una rarità.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Voglio che la cosa sputi alcuni log in modo casuale durante la mia sessione SSH. Aspetta, cosa? No, non lo vorrei mai. Grazie disown.

  4. Unaltra cosa che non voglio mai: convertire il processo a un demone completamente scollegato, ma evita di avviarlo automaticamente al prossimo avvio. Non lo vorrei mai perché non posso prevedere quando il sistema si riavvierà e chi lo riavvierà.

Risposta

In genere, faccio semplicemente quanto segue:

  1. myprog & se voglio solo eseguire qualcosa in background da la mia attuale shell di login. Questo è sufficiente per me il 99% delle volte …

  2. nohup myprog > /my/path/output.txt & se avvio qualcosa dalla shell, ma voglio disconnettersi in seguito (magari mentre lattività in background è ancora in esecuzione).

Answer

Tu deve distinguere luscita dalla shell dallannullare il terminale.

  1. La shell uccide tutti i lavori conosciuti (ma non i loro figli) quando riceve un segnale di interruzione.
  2. Il terminale uccide tutto ciò per cui era il terminale di controllo.

In generale la soluzione migliore (a livello di utente) IMHO è screen.

Se la tua attività è piuttosto correlata al sistema che allutente, potresti renderla un servizio systemd invece che avvii manualmente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *