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.