GNU/Linux >> Linux Esercitazione >  >> Linux

Come faccio a eseguire il fork di un processo che non muore quando la shell esce?

Il metodo più affidabile sembra essere:

(setsid emacs &)

Questo utilizza ( &) per passare allo sfondo e setsid per staccarsi dal tty di controllo.

Puoi inserirlo in una funzione di shell:

fork() { (setsid "[email protected]" &); }

fork emacs

Le possibilità sono:

  • Il disown comando integrato:

    emacs &
    disown $!
    

    & funge da separatore di comandi e disown per impostazione predefinita sarà il lavoro più recente, quindi può essere abbreviato in:

    emacs & disown
    
  • Doppio-fork() :

    (emacs &)
    

    Comandi tra parentesi ( ) vengono eseguiti in un processo shell separato.

  • setsid , come suggerito da Rich, potrebbe essere la scelta migliore, perché disattiva il TTY di controllo del processo creando una nuova sessione:

    setsid emacs
    

    Tuttavia, è anche un po' imprevedibile:sarà solo fork() allo sfondo se è il leader di un gruppo di processi (cosa che non accadrà se setsid è usato in un sh sceneggiatura, per esempio; in tali occasioni diventerà semplicemente resistente a Ctrl-C.)


Non specifichi se è in esecuzione come app X o app console.

Se è un'app per console, ovviamente deve essere chiusa. Ti sei sbarazzato del suo input/output, più tecnicamente lo (pseudo) tty su cui si trovava. È molto improbabile che tu intendessi questo, quindi supponiamo che tu stia parlando di un'app X.

nohup dovrebbe funzionare, non so perché non lo sia. Quando la shell si chiude, invia SIGHUP a tutti i processi nel relativo gruppo di processi. nohup dice al comando di ignorare SIGHUP.

Puoi anche provare setsid, che disconnette il processo dal gruppo di processi

alias emacs='setsid emacs'

Oppure aggiungi disown dopo &


Controlla le impostazioni della shell. Puoi anche provare screen invece di nohup .


Linux
  1. [Linux]:come escludere la directory quando si utilizza il comando shell "tar".

  2. Come ricevere una notifica quando Svcadm riavvia un servizio che è morto?

  3. Come avviare tutte le sessioni della shell in una directory diversa da $home?

  4. Come far morire il processo figlio dopo che il genitore è uscito?

  5. In che modo copy-on-write in fork() gestisce più fork?

Esiste una distribuzione Linux o una patch del kernel che cancella lo spazio di memoria di un processo dopo che il processo è terminato?

Come eseguire uno script quando arriva una posta nel server di posta? (Debian)

Come disabilitare l'arresto in modo che un processo importante non possa essere interrotto?

Linux - Come posso vedere quando è iniziato un processo?

Come posso avviare una seconda shell in modalità utente singolo?

Come uccidere un processo che non muore mai?