Esecuzione di più comandi nohup in background


12

Ho due comandi cmd1 e cmd2. Dei due, cmd2 impiega più tempo per terminare. È necessario eseguire cmd2 e quindi cmd1.

Ho provato a eseguirli nel modo seguente:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

o

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Ma entrambe le volte che vedo cmd1 non sta aspettando il completamento di cmd2 e il risultato 1 viene riempito.

Come far funzionare cmd1 dopo cmd2 quando entrambi dovrebbero essere processo nohup ed essere eseguiti in background?


Questa domanda è già stata posta unix.stackexchange.com/questions/67006/…
Rahul Patil

2
La domanda in unix.stackexchange.com/questions/67006/… è leggermente diversa poiché volevo mantenere il mio ordine di esecuzione. Per favore, correggimi se sbaglio nel capire l'altra domanda.
user33767

Risposte:


12

Hai fatto entrambi cmd1e cmd2corri in parallelo. Hai detto: “Avvia cmd2 in background e interrompi qualsiasi associazione con esso. Avvia cmd1 in background e interrompi qualsiasi associazione con esso. " Volevi dire: “Avvia cmd2 in background; quando è completo, avvia cmd1 (anche in background). " Poiché non esiste più alcuna associazione con l'attività in background, è necessario ideare un'attività in background che esegue cmd2 quindi cmd1. Questo è cmd2; cmd1(o meglio cmd2 && cmd1eseguire cmd1 solo se cmd2 ha esito positivo), e dovrai dire nohupdi avviare una shell in esecuzione in background per quello.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &

Grazie. Funziona benissimo. Sì, è quello che stavo pensando, dopo aver portato il primo cmd in background, non influisce sul secondo comando, che inizia anche se volevo che il primo comando finisse. Devo leggere il manuale sull'invio del comando in background.
user33767

3

Se non ti dispiace non usare nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown

Lo verificherò. Ma attualmente andrà con la risposta di Giles in cui il comando è racchiuso da sh. Grazie comunque
user33767

Questa è una cattiva idea. Quando l'utente si disconnette dalla console, interromperà la sessione.
mootmoot

@mootmoot funziona come previsto, controlla tu stesso; i comandi non riceveranno SIGHUP alla chiusura della shell genitore.
Artty

Sì, è sicuro per la shell se si esegue il comando utilizzando crond / crontab. Ma non è sicuro pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot

2

Usa semplicemente:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &

Mentre eseguo il comando multiplo va bene, volevo mantenere l'ordine esatto di esecuzione, cioè prima cmd2 e poi cmd1 e non succede con il comando sopra. grazie
user33767

0

facci sapere cosa stai facendo esattamente con cmd2 e cmd1. Dipende dal tipo di attività e dall'output desiderati dal comando. Se stai affrontando il problema di premere due volte il tasto Invio con comando, questo può essere capito dal mio post

puoi andare anche in questo modo

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Vedi lo screenshot qui sotto, qui sto usando 3 comandi e tutti eseguo uno per uno in serie. Ho usato i backtick per questo compito. Nello screenshot è anche possibile osservare la data e l'ora. Il comando sleep ha 60 secondi, quindi dopo 60 secondi il mio prossimo comando viene eseguito correttamente. Ho usato il comando jobs per verificare se qualsiasi comando è ancora in esecuzione in background. Qui no. dei lavori che puoi vedere è 1.

nohup-multiple-comando

Questo screenshot è disponibile anche in questo link , se non è visibile

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.