Comandi di shell asincroni


100

Sto cercando di utilizzare uno script di shell per avviare un comando. Non mi interessa se / quando / come / perché finisce. Voglio che il processo inizi e funzioni, ma voglio essere in grado di tornare immediatamente alla mia shell ...


2
Correlato, vedere Differenza tra nohup, disown e & su Unix e Linux Stack Exchange.
— jww

1
Per chi cerca una maggiore risposta in profondità che parla delle differenze tra nohup, &edisown , clicca qui per scorrere alla quarta risposta .
— noɥʇʎԀʎzɐɹƆ

Risposte:


116

Puoi semplicemente eseguire lo script in background:

$ myscript &

Nota che questo è diverso dal mettere il & interno del tuo script, che probabilmente non farà quello che vuoi.


1
Sapevo che sarebbe stato qualcosa di facile, grazie mille ... Linux non fa per me, ma sto cercando di mettermi al passo ... Btw, funzionerà se combinato con nohup?
— LorenVS

2
Qual è la differenza tra mettere il & sulla riga di comando e metterlo nello script? Non sapevo che fossero diversi.
— Jacob Sharf

8
@JacobSharf, provalo e vedrai. Se &è all'interno dello script e non si dispone di wait, il comando in background verrà interrotto quando lo script termina.
— Carl Norum

Oh. Questo spiega molto. Di recente ho notato un effetto che sarebbe stato causato da questo. Cercando su Google effettivamente mi ha portato a questa pagina. Grazie
— Jacob Sharf

Se myscriptmodifica l'ambiente del terminale, es. è un comando di inizializzazione del terminale che non è necessario immediatamente e può essere ritardato, modificherà comunque l'ambiente del terminale?
— noɥʇʎԀʎzɐɹƆ

58

Tutti se ne sono semplicemente dimenticati disown. Quindi ecco un riassunto:

  • & mette il lavoro in background.

    • Blocca il tentativo di lettura dell'input e
    • Fa in modo che il guscio non attenda il suo completamento.
  • disown rimuove il processo dal controllo dei lavori della shell, ma lo lascia comunque connesso al terminale.

    • Uno dei risultati è che la shell non gli invia un SIGHUP(se la shell riceve un SIGHUP, invia anche unSIGHUP al processo, che normalmente fa terminare il processo).
    • E ovviamente, può essere applicato solo ai lavori in background (perché non puoi inserirlo quando è in esecuzione un lavoro in primo piano).
  • nohupdisconnette il processo dal terminale, reindirizza il suo output nohup.oute lo protegge SIGHUP.

    • Il processo non riceverà alcun inviato SIGHUP.
    • È completamente indipendente dal controllo del lavoro e potrebbe in linea di principio essere utilizzato anche per lavori in primo piano (anche se non è molto utile).
    • Di solito utilizzato con &(come lavoro in background).

Non riesco a trovare disownsu Debian o OS X. Pensavo fosse un programma, ma mi sembra di sbagliarmi. Che cos'è?
— jww


6
Questa è la migliore risposta. Il più completo.
— noɥʇʎԀʎzɐɹƆ

3
Sicuramente la risposta migliore, non so perché così piccoli
— aumenti

1
@VladGanshin No.
— Ani Menon

39
nohup cmd

non riaggancia alla chiusura del terminale. l'output di default va a nohup.out

Puoi combinarlo con lo sfondo,

nohup cmd &

e sbarazzarsi dell'output,

nohup cmd > /dev/null 2>&1 &

puoi anche disownun comando. digitare cmd, Ctrl-Z, bg,disown


2
Fantastico, folle come tutto si combina, penso che all'inizio l'ordinazione mi arriverebbe, ma suppongo che potresti semplicemente memorizzarlo (cosa hai scritto o "nohup cmd &> / dev / null 2> & 1" :))
— LorenVS

Mi sono imbattuto in questo stasera. Ho combattuto con uno script di shell per 2 giorni e questo suggerimento ha funzionato. Grazie mucho!
— JD Long

Fantastico, è molto utile. Quando si esegue in modalità background, è possibile controllare l'output del comando ogni tanto usando tail nohup.out, questo mostrerà le ultime 10 righe dell'output del comando. Lo uso per i processi di backup rsync per vedere in quale file si trova attualmente.
— Martin Hansen

E se lo faccio, ma voglio interrompere il processo in background?
— Stephan Bijzitter

La shell stampa un identificatore di lavoro quando si avvia un lavoro proprio per questo scopo. Puoi vedere i tuoi lavori in esecuzione in qualsiasi momento con jobs.
— tripleee

26

In alternativa, dopo aver avviato il programma, puoi premere Ctrl-Z che interrompe il programma e quindi digitare

bg

che mette in background il tuo ultimo programma interrotto. (Utile se hai iniziato qualcosa senza '&' e lo vuoi ancora in background senza riavviarlo)


2
Grazie, questo è un bel trucco ... Iniziando ad apprezzare davvero un po 'della bontà del guscio ...
— LorenVS

3

screen -m -d $command$avvia il comando in una sessione scollegata. È possibile utilizzare screen -rper collegarsi alla sessione avviata. È uno strumento meraviglioso, estremamente utile anche per sessioni remote. Maggiori informazioni su man screen.


@LadenkovVladislav Sono sicuro al 95% che puoi installare Screen su RedHat. Ho su CentOS.
— BuvinJ

Su Ubuntu, volevo emulare il comando "start" di Windows / batch. Vale a dire avviare in modo asincrono un programma in primo piano (gui) e continuare attraverso uno script di shell. Questo fa esattamente quello.
— BuvinJ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.