Posso nohup / schermare un processo già avviato?


260

Sto eseguendo alcuni test di script di migrazione dei dati a esecuzione prolungata, su SSH. Supponiamo che inizi a eseguire uno script intorno alle 16:00; ora, alle 18.00 rotola in giro, e mi sto maledendo per non aver fatto tutto questo screen.

Esiste un modo per "retroattivamente" nohupun processo o devo lasciare il mio computer online tutta la notte? Se non è possibile collegarsi screena / nohupun processo che ho già avviato, perché? Qualcosa a che fare con il modo in cui i processi genitore / figlio interagiscono? (Non accetterò una risposta "no" che non risolva almeno la domanda del "perché" - scusate;))


4
Ho appena visto un post interessante sul blog disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

Risposte:


212

Se stai usando Bash, puoi eseguire disown -h job

rinnegare

disown [-ar] [-h] [jobspec ...]

Senza opzioni, ogni jobspec viene rimosso dalla tabella dei lavori attivi. Se -hviene fornita l' opzione, il lavoro non viene rimosso dalla tabella, ma viene contrassegnato in modo che SIGHUP non venga inviato al lavoro se la shell riceve un SIGHUP. Se jobspec non è presente e non viene fornita -ané l' -ropzione né , viene utilizzato il lavoro corrente. Se non viene fornito jobspec, l' -a opzione significa rimuovere o contrassegnare tutti i lavori; l' -ropzione senza un argomento jobspec limita l'operazione ai lavori in esecuzione.


Eccezionale; Speravo che qualcosa del genere si presentasse.
ojrac,

7
La vita può essere ingiusta. gharper e io stavamo pubblicando questo nello stesso momento :)
serverhorror il

4
Sei il mio eroe
Thomas Dignan il

9
disown non è specifico per bash. È anche in zsh, ksh93, ...
Phil P

2
Ho scoperto che in realtà devi usare disown %1se 1 è il jobspec, a differenza di fg o bg in cui usi bg 1 serverwatch.com/tutorials/article.php/3935306/…
mltsy

81

Usa reptyr

Dal README:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Alcuni post del suo autore:


Continuerò a utilizzare strumenti integrati (ad es. Rinnegare), ma non è flessibile come reptyr. +1
ojrac,


16

Quando inizia un processo, STDIN, STDOUT e STDERR sono collegati a qualcosa . Generalmente non è possibile modificarlo una volta avviato il comando. Nel caso che stai descrivendo, è probabilmente un tty associato alla sessione ssh. nohup praticamente fa solo ...

command < /dev/null > nohup.out 2>&1

Cioè, imposta STDIN su / dev / null, STDOUT su un file e STDERR su STDOUT. Lo schermo fa cose molto più sofisticate che coinvolgono l'installazione di tty che si dirigono verso se stesso.

Non conosco alcun modo per retroattivamente nohup o screening di un processo in esecuzione. Se fai cd in / proc / $ pid / fd e vedi cosa indicano 0, 1 e 2.

Potresti avere un po 'di fortuna con il rinnegamento, ma non se il processo tenta di fare qualcosa con STDIN, STDOUT o STDERR.


2
+1 per i buoni commenti. st (din | out | err) è l'altra metà del problema, e apprezzo i consigli su dove iniziare a cercare, la prossima volta che mi trovo in questa marmellata.
ojrac,

6
In realtà puoi cambiarlo sulla maggior parte degli Unix. È un trucco disgustoso. Lo adoro. :) Quello che fai è connetterti al processo usando il supporto di debug come ptrace, quindi forzare il processo a chiamare dup2 () per riconnettere 0,1,2 ad un altro filehandle.
Zan Lynx,

2
sì, puoi cambiarlo. Implica la sospensione del processo (SIGSTOP) e la modifica dei descrittori di file per fd 0, 1, 2. Quindi il riavvio (SIGCONT).
Michael Martinez,

13

Cryopid è un ulteriore sviluppo dell'autore di grab.c che blocca un processo in un file, che viene quindi eseguito (all'interno dello schermo) per riprendere il processo.


1
Bello! Ho cercato di usare il cryopid nella tesi di laurea del mio maestro sulla migrazione dei processi, ma non ha funzionato tutte le volte, qualunque cosa avessi fatto. Alla fine, ho dovuto usare dynckpt con una versione antica di Linux. Sei forse coinvolto nello sviluppo del cryopid? Vedo che il tuo nome è simile al dominio dell'autore.
Juliano,

1
Non sono coinvolto nello sviluppo, conosco l'autore dall'università. Al momento non ha il tempo di mantenere il cryopid, quindi sembra che alcune persone abbiano
TRS-80

12

Posso solo darti un semplice "No" senza il perché per la parte dello schermo, sarei interessato al motivo me stesso.

Comunque hai provato disown(un built-in bash)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.


5

Recentemente ho visto un collegamento a Neercs , che è un'utilità simile a uno schermo costruita usando libcaca, una libreria a colori di arte ascii. Tra le altre funzionalità, vanta la possibilità di afferrare un processo esistente e riprogrammarlo all'interno della sessione di Neercs (schermo).

Tuttavia non l'ho usato, quindi non posso commentare se funziona o meno.


2

Probabilmente lo sto pensando male, quindi sentiti libero di correggermi (ho già imparato a disconoscere!) ... Un ctrl-Z e "bg" funzionerebbero almeno per far funzionare il processo in background? O è il problema chiave che vorresti ancora vedere STDOUT mentre è in esecuzione?


1
Ciò ucciderebbe ancora il processo quando il proprietario tty muore, quindi l'OP deve lasciare la scatola in cui ha avviato il comando in esecuzione, che è ciò che vuole evitare
serverhorror

OK lo comprerò. Grazie per la spiegazione. Quindi i suggerimenti -h rinnegati sembrano sicuramente molto più intelligenti dei miei :-)
Chris_K

1
Si potrebbe ancora fare questo, solo dopo che avrei dovuto rinnegare -h: stackoverflow.com/a/625436/705198
AndrewPK

2

Se riesci a vivere senza poter interagire con il processo e non ti opponi al caricamento di moduli del kernel casuali, potresti fare di peggio che guardare Snoop . In alternativa, ci sono un paio di altri progetti. Ecco una chiamata injcode, che può fare principalmente quello che vuoi fare.



1

Volevo usare nohup(o simili) per avviare il linksbrowser della riga di comando e collegarlo dopo aver scaricato un file dal sito Web ASP.NET con un processo di autenticazione complicato e un sacco di stato di visualizzazione nascosto che rendeva difficile usare il lavoro con curl/ wget.

Alla fine ho finito per usare ciò tmuxche ha risolto il lavoro alla grande:

  1. Correre tmux
  2. Esegui la tua app ( linksnel mio caso) e lasciala in esecuzione
  3. Chiudi la sessione SSH, l'app rimarrà in esecuzione
  4. Connettiti con SSH allo stesso computer in un secondo momento ed esegui tmux attachper riportare l'app sullo schermo

tmux è eccezionale, ma, come nohup o schermo, funziona solo se lo si utilizza prima di iniziare il processo. Questa domanda riguarda i tempi in cui ti rendi conto che hai bisogno di tmux dopo che il processo è già in esecuzione.
ojrac,

-1

Sei preoccupato per il timeout della sessione? In tal caso, è possibile Ctrl-z e bg il processo, quindi inserire qualcosa per mantenere viva la sessione come un "ping -t localhost" o "top".

Se vuoi disconnetterti, temo di non poter aggiungere altri commenti.


È il logout.
ojrac,

1
Un altro modo per fermare la disconnessione è eseguire top. Ci si sposta sempre di qualche byte in giro.
Rory,
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.