Esci piacevolmente da uno script di Bash


1

Sto implementando la soluzione di registrazione presentata qui e non so se sono necessarie le seguenti righe ogni volta che esco dal processo / script Bash padre:

if [ -n "$teepid" ]; then
    exec 1>&- 2>&-  # Close file descriptors to signal EOF to the `tee`
                    # command in the background process
    wait $teepid # Wait for background process to exit
fi

Queste righe si trovano nella log()funzione e alla fine dello script. So che sono richiesti nella log()funzione, ma sono richiesti alla fine dello script?

In altre parole: il mio lavoro in background terminerebbe bene senza che il codice sopra menzionato fosse scritto prima di ogni exitcomando nel mio processo genitore?

Risposte:


1

Il processo identificato da PID $teepidviene eseguito in background utilizzando &. Se esci senza aspettare che il PID finisca, l'unica cosa negativa che accadrà è la stessa cosa che succede se lo usi &nella shell. Premerai [Invio] in un secondo momento e verrai infastidito da un messaggio [1] {pid} exited(o qualcosa di simile, non ricordo esattamente ora) prima che venga visualizzata la riga di prompt successiva.


"Se esci senza aspettare che il PID finisca, l'unica cosa negativa che accadrà è la stessa cosa che succede se usi e nella shell." - Cosa significa?
Dor

Prova a entrare echo "hello" &da un prompt della shell, premi due volte INVIO e vedrai cosa intendo.
LawrenceC,

1
Mi dispiace venire alla festa in ritardo (e non invitato), ma credo che ti sbagli. Nella mia esperienza, i processi sono consapevoli solo dei propri figli. Se uno script di shell scollega un sottoprocesso, il processo parent dello script (comunemente una shell interattiva) non ha conoscenza di quel (sotto) processo e non saprà quando termina.
Scott,

1
Puoi dimostrarlo rapidamente e facilmente digitando (echo "hello" &)–– le parentesi forzano la creazione di un nuovo processo anche prima che echo "hello" &venga interpretato, e poi che, ovviamente, forgia un processo ad un altro livello –– simulando lo scenario di uno script che inizia un sottoprocesso asincrono. Un'altra buona illustrazione: (sleep 42 &)e poi wait–– riavrai immediatamente il prompt della shell, ma a psmostrerà che sleepè ancora in background.
Scott,

1
Il problema / rischio, tuttavia, che se questo script di registrazione non attende il completamento dei teeprocessi, è possibile che il prompt della shell venga riavviato prima del completamento teee che quindi si possa ottenere l'output dal tee(che viene generato dallo script) visualizzato dopo che viene visualizzato il prompt della shell. Se è più di una riga o due, è molto facile per l'utente non vedere il prompt della shell e quindi supporre che lo script sia ancora in esecuzione, quando, in realtà, è fatto.
Scott,
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.