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;))
Se stai usando Bash, puoi eseguire disown -h job
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
Né-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.
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:
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.
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.
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.
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.
Nohup su Solaris/OpenSolaris ha un flag -p per Nohup un processo in esecuzione - per esempio, vedere pagina man di Nohup Solaris 1 .
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.
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)
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?
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:
tmux
links
nel mio caso) e lasciala in esecuzionetmux attach
per riportare l'app sullo schermo