Considera la seguente nohup
esecuzione:
nohup script.sh > script.out &
C'è un modo per disconnettersi dal terminale, riconnettersi, riportare il processo in primo piano e interagire con esso usando la tastiera?
Considera la seguente nohup
esecuzione:
nohup script.sh > script.out &
C'è un modo per disconnettersi dal terminale, riconnettersi, riportare il processo in primo piano e interagire con esso usando la tastiera?
Risposte:
Se si desidera avviare uno script, farlo funzionare senza che l'output disturbi il terminale e quindi visualizzarlo in seguito per interagire con esso, è possibile dare un'occhiata a un multiplexer terminale. A seconda del sistema che consiglierei tmux
o screen
. Puoi trovare alcune informazioni su come usarli nei link seguenti:
tmux:
schermo:
modifica: aggiunti collegamenti per primer tmux
nohup non disconnette un comando dal terminale, fa ignorare lo scriptSIGHUP
e reindirizzastdout/stderr
a un filenohup.out
, in modo che il comando possa continuare a essere eseguito in background dopo la disconnessione.
nohup
non inserisce automaticamente il comando che esegue in background. Bisogna farlo esplicitamente, terminando la riga di comando con un &
.
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobs
possono stampare i lavori attualmente in esecuzione e il loro stato. Se il comando jobs
non riesce a trovarlo, non è più un processo figlio di quella shell.
$ jobs
[1]+ Running nohup ./script.sh &
Si può riportare un lavoro in background in primo piano in bash usando fg
anche se viene eseguito con nohup
. Ma ciò non cambierà il reindirizzamento dell'output, che andrà comunque al filenohup.out
.
$ fg
nohup ./script.sh
Se si chiude la shell / terminale o si disconnette, il comando non è più figlio di quella shell. Appartiene al init
processo. Se cerchi in pstree
, vedrai che ora è di proprietà del processo 1 ( init
). Questo non può essere riportato in primo piano perché il primo piano non esiste più.
If the command jobs cannot find it, then it is no longer a child process of that shell.
Questo è sbagliato: provare questa sequenza per vedere come: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$
. Dopo questo comando vedrai ancora il sleep
lavoro con lo stesso PID stampato quando lo hai generato, mentre jobs
non stamperà nulla. L'unico modo in cui un processo figlio può smettere di essere figlio è perdere il proprio genitore (quindi l'orfano diventa figlio init
) o biforcarsi + uscire (ma poi il PID cambia, quindi non è il figlio originale).
In secondo luogo l'uso di un terminale multiplexer, ma tmux , non schermo. Lo schermo è, a tutti gli effetti, non mantenuto. La sua configurazione è un'arte oscura, probabilmente registrata per la prima volta in un'appendice del Necronomicon. Tentare di scrivere la propria configurazione è uno scorcio di Cthulu. Sul serio. Dai un'occhiata ai file .screenrc delle persone . A dire il vero, ci sono modi per mediare l'abominio dello schermo di una configurazione. Byobu fa un lavoro ammirevole come il velo tra utenti mortali e codice empio. Viene fornito con colori sensibili, un'interfaccia di menu e, soprattutto, una barra di stato.
Ma come ho detto, consiglio invece tmux . Richiede ancora una configurazione minore, ma è ben documentato e il tuo file di configurazione non sembrerà incomprensibile. Inoltre, inizi con i colori e una barra di stato. Confronta i miei file screenrc e tmux.conf:
Qualsiasi comando Linux può essere inviato in background con ' &
' aggiunto alla fine.
Per visualizzare tutti i lavori in background, è possibile emettere jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
Qui sto eseguendo 3 lavori in background: zookeeper, kafka e mongo daemon. [1], [2] e [3] sono i rispettivi numeri di lavoro per queste attività.
Puoi portare queste attività in primo piano usando fg %$taskNumber.