risposta-alla-domanda-sullo-sviluppo-web-bd.com

Posso Nohup / schermare un processo già avviato?

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, 6 PM rotola in giro e mi sto maledendo per non aver fatto tutto questo in screen.

Esiste un modo per "retroattivamente" Nohup un processo o devo lasciare il mio computer online tutta la notte? Se non è possibile collegare screen a/Nohup un processo che ho già avviato, allora 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;))

262
ojrac

Se stai usando Bash, puoi eseguire disown -h job

disown

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

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

212
gharper

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:

82
Jonathan Tran

Per rubare un processo da un tty al tuo attuale tty, potresti provare questo hack:

http://www.ucc.asn.au/~dagobah/things/grab.c

Ha bisogno di un po 'di formattazione per compilare con le attuali versioni di Linux/glibc, ma funziona ancora.

22
Juliano

Quando inizia un processo, STDIN, STDOUT e STDERR sono collegati a qualcosa. Generalmente non è possibile modificarlo una volta avviato il comando. Nel caso in cui 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 schermare 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.

17
freiheit

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

Tuttavia 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.
13
serverhorror

Cryopid è un ulteriore sviluppo dell'autore di grab.c che blocca un processo in un file, che viene quindi eseguito (nella schermata interna) per riprendere il processo.

13
TRS-80

Nohup su Solaris/OpenSolaris ha un flag -p per Nohup un processo in esecuzione - per esempio, vedere pagina man di Nohup Solaris 1 .

9
alanc

Recentemente ho visto un collegamento a neercs , che è un'utilità simile a uno schermo costruita usando libcaca, una libreria a colori ASCII-art. 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.

5
Daniel Lawson

Puoi reindirizzare l'output del processo su file con gdb

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

e poi rinnegarlo

Aggiornamento: ho dovuto eseguire gdb con Sudo e un comando gdb leggermente diverso in Ubuntu 18.04:

p (int)dup2(open("/tmp/test.stdout", 1), 1)

2
d9k

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?

2
Chris_K

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. Qui è un injcode di una chiamata, che può fare principalmente quello che vuoi fare.

2
David Pashley

Volevo usare Nohup (o simile) per avviare il browser della riga di comando links e collegarlo dopo aver scaricato un file dal sito Web ASP.NET con un processo di autenticazione complicato e molti stato della vista nascosta che ha reso difficile l'utilizzo del lavoro con curl/wget.

Alla fine ho usato tmux che ha risolto il lavoro alla grande:

  1. Esegui tmux
  2. Esegui la tua app (links nel mio caso) e lasciala in esecuzione
  3. Chiudi la sessione SSH, l'app rimarrà in esecuzione
  4. Connettiti con SSH alla stessa macchina in un secondo momento ed esegui tmux attach per riportare l'app sullo schermo
1
Dmitry Gusev