Porta il lavoro nohup in primo piano


14

Considera la seguente nohupesecuzione:

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:


7

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 tmuxo screen. Puoi trovare alcune informazioni su come usarli nei link seguenti:

tmux:

schermo:

modifica: aggiunti collegamenti per primer tmux


+1 Strumento eccellente che non conoscevo. Grazie molto.
Adam Matan,

19

nohup non disconnette un comando dal terminale, fa ignorare lo scriptSIGHUPe reindirizzastdout/stderra un filenohup.out, in modo che il comando possa continuare a essere eseguito in background dopo la disconnessione.

nohupnon 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’

jobspossono stampare i lavori attualmente in esecuzione e il loro stato. Se il comando jobsnon 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 fganche 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 initprocesso. 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 sleeplavoro con lo stesso PID stampato quando lo hai generato, mentre jobsnon 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).
Ruslan,

4

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:


0

Se sei solo interessato a guardare l'output live, questo potrebbe adattarti:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0

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.

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.