Verifica il comando disown


10

Ho emesso la ^z; bg; disownsequenza per consentirmi di chiudere una sessione SSH in cui sto eseguendo un processo di lunga durata estremamente importante. Questo processo scrive l'output di stato su stderr e ha continuato a farlo anche dopo essere stato staccato (verificato con lsof, lo stderr fd è aperto per r / w).

C'è un modo per determinare che il processo è stato davvero rinnegato (non riceverà SIGHUP se la shell lo recupera)?


1
Mi chiedo se questo debba andare su unix.stackexchange.com
Rilindo l'

2
Solo curioso, perché no: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Risposte:


12

In Bash, il disowncomando emesso da solo rimuoverà i processi in background (tramite bgo &) dalla tabella dei lavori attivi e li contrassegnerà per non ricevere un SIGHUP al logout.

Puoi anche passare uno o più lavori da respingere, come disown 1 3. Il disown -hflag è utile se si desidera mantenere i lavori nella tabella, ma non ancora SIGHUP al logout.

È possibile visualizzare la tabella dei lavori immettendo il jobscomando. Dopo uno sfondo di successo, mostrerà [1]+ command &. Dopo aver rinnegato un lavoro, non dovrebbe più essere visualizzato nella tabella dei lavori e non essere più eliminato al logout. È ancora possibile visualizzare il processo di via ps ux, tope altre utilità di processo-osservazione.

Dopo che un lavoro è stato rinnegato, è possibile attendere che termini in modo naturale o inviare un segnale killal PID per interromperlo.

Poiché Bash sta semplicemente rimuovendo il lavoro dall'elenco dei lavori in esecuzione da terminare e il file viene gestito dallo stdout del terminale e lo stderr è ancora aperto, continuerai a ricevere l'output dal lavoro fino alla chiusura del dispositivo terminale (quando esci) .

Esempi:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Io di solito uso solo disownse si esegue un comando potenzialmente di lunga durata come un rsynco cpe poi decidere ho bisogno di uscire senza terminare esso. Se sai che eseguirai un comando e ti disconnetterai, puoi catturare l'output teeeseguendo il piping o inserendolo in un file, eseguendolo nohupo eseguendolo screen(che ti consente di riprendere la proprietà del comando / terminare in seguito ).

Esempi:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null

1
+1 informativo e con esempi. Bello!
Andy Smith,

Commento molto informativo; stai dicendo che non è possibile verificare il distacco di un processo (oltre a notare che non esiste più nella tabella dei lavori)?
mikewaters,

1
quando si esegue detachun lavoro in background, verrà staccato :) non c'è davvero una via di mezzo lì dove eseguirlo su un processo in background non farà nulla. il controllo jobsverifica solo che non hai provato a staccare un processo interrotto o qualcosa del genere.
lunixbochs
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.