GNU/Linux >> Linux Esercitazione >  >> Linux

Posso eseguire il nohup/screening di un processo già avviato?

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-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.

Linux
  1. Opzioni di comando nohup in Linux

  2. Come posso uccidere un processo per nome invece che per PID?

  3. Come fermare un processo dello schermo in Linux?

  4. Come ottenere l'ID del processo per terminare un processo nohup?

  5. Come posso sapere quale processo sta usando lo scambio?

Come posso mantenere vivo un processo dopo aver chiuso la sessione putty?

Cosa fare quando Ctrl + C non può terminare un processo?

Posso riprendere un processo vim esistente?

Perché non posso terminare questo processo su Linux?

Un processo può essere eseguito indipendentemente da qualsiasi shell?

Un processo può avere un proprietario? Cosa significa?