Soluzione 1:
Se stai usando Bash, puoi eseguire disown -h job
rinnegare
disown [-ar] [-h] [jobspec ...]
Senza opzioni, ogni specifica di lavoro viene rimossa dalla tabella dei lavori attivi. Se
-h
viene data 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, né-a
né-r
viene fornita l'opzione, viene utilizzato il lavoro corrente. Se non viene fornito nessun jobspec, il-a
opzione significa rimuovere o contrassegnare tutti i lavori; il-r
l'opzione senza un argomento jobspec limita l'operazione ai lavori in esecuzione.
Soluzione 2:
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 sul blog del suo autore:
- reptyr:collega un processo in esecuzione a un nuovo terminale
- reptyr:modifica del terminale di controllo di un processo
Soluzione 3:
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 riformattazione per essere compilato nelle attuali versioni di Linux/glibc, ma funziona ancora.
Soluzione 4:
Quando un processo inizia, STDIN, STDOUT e STDERR sono connessi 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. Screen fa cose molto più sofisticate che includono l'impostazione di tty che indirizzano a se stesso.
Non conosco alcun modo per annullare retroattivamente o schermare un processo in esecuzione. Se vai su /proc/$pid/fd e vedi a cosa puntano 0, 1 e 2.
Potresti avere un po' di fortuna con il rinnegamento, ma non se il processo cerca di fare qualcosa con STDIN, STDOUT o STDERR.
Soluzione 5:
Posso solo darti un semplice "No" senza il perché per la parte sullo schermo, sarei interessato io stesso al motivo.
Comunque hai provato disown
(un bash integrato)
~ $ 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.