it-swarm.it

Come posso rinnegare un processo in esecuzione e associarlo a una nuova shell dello schermo?

Ho un programma in esecuzione su una shell SSH. Voglio metterlo in pausa ed essere in grado di interrompere la sua esecuzione quando torno.

Un modo in cui ho pensato di farlo è stato quello di trasferire la sua proprietà su uno schermo Shell, mantenendolo così attivo.

C'è un modo diverso di procedere?

164
levesque

Usare GNU screen è la soluzione migliore.

Avvia schermata in esecuzione al primo accesso - Corro screen -D -R, esegui il tuo comando e disconnetti o sospendilo con CTRL-Z e quindi disconnettiti dallo schermo premendo CTRL-A quindi D.

Quando accedi nuovamente alla macchina, riconnettiti eseguendo screen -D -R. Sarai nella stessa Shell di prima. Puoi eseguire jobs per vedere il processo sospeso se lo hai fatto ed eseguire %1 (o il rispettivo numero di lavoro) per metterlo di nuovo in primo piano.

88
Andrew Yochum

È possibile revocare la "proprietà" del programma dalla Shell con disown incorporato:

# press Ctrl+Z to suspend the program
bg
disown

Tuttavia, ciò dice solo alla Shell di non inviare un segnale SIGHUP al programma quando Shell esce. Il programma manterrà tutte le connessioni che ha con il terminale, di solito come flussi di input, output ed errori standard. Non è possibile ricollegarli a un altro terminale. ( Schermo funziona emulando un terminale per ogni finestra, quindi i programmi sono collegati alla finestra dello schermo.)


È possibile ricollegare i descrittori di file a un altro file collegando il programma in un debugger (ovvero usando ptrace ) e facendolo chiamare open, dup e close. Ci sono alcuni strumenti che lo fanno; questo è un processo complicato e, a volte, si bloccherà invece il processo. Le possibilità includono (collegamenti raccolti dalle risposte a Come posso rinnegare un processo in esecuzione e associarlo a una nuova shell dello schermo? e Posso Nohup/schermare un processo già avviato? =):

Per spostare un processo tra terminali o ricollegare un sconosciuto, è possibile utilizzare ad es. reptyr .

67
jofel

La mia soluzione preferita sta usando tmux, potresti staccare la sessione e ricollegarla in un altro terminale.

Quando ti sei disconnesso dalla sessione precedente, puoi chiudere in sicurezza il terminale; successivamente usa tmux attach per tornare alla sessione, anche se ti sei disconnesso.

28
daisy

C'è anche una piccola utility chiamata retty che ti consente di ricollegare i programmi in esecuzione su un altro terminale.

21
adamg

Non lo uso regolarmente, ma neercs afferma di supportarlo. È un programma simile a screen con varie funzioni fantasiose come una migliore gestione dei riquadri, ma la cosa principale che offre è la possibilità di importare un processo in un riquadro

19
Michael Mrozek

Se vuoi solo metterlo in pausa e riavviarlo in seguito, puoi usare kill con il segnale STOP o CONT.

Inizialmente scopri i processi con PID

$ ps aux

Quindi inviare i segnali a quel PID elencato nel processo

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

"injcode" di ThomasHabets sembra essere esattamente ciò di cui ho bisogno:

https://github.com/ThomasHabets/injcode

Il programma injcode consente l'iniezione di codice arbitrario in un processo in esecuzione, indipendentemente dal fatto che tu lo sapessi in anticipo e stavi eseguendo screen o tmux

Dal README:

Esempio 1: spostare irssi da un terminale all'altro

Magari spostalo in uno schermo.

Primo avvio irssi in un terminale.

Esegui injcode in un altro terminale: $ injcode -m retty

Ora Irssi dovrebbe essere spostato sul secondo terminale, incluso avere un nuovo terminale di controllo.

9
user2688272

Questo ha funzionato per me:

  1. bg il processo
  2. jobs -l trova il numero di processo
  3. tmux avvia il gestore di finestre Shell
  4. reptyr -L PROCESSNUMBER

reptyr 's -L era necessario per farlo funzionare:

-L Like '-l', but also redirect the child's stdio to the slave.

a causa di questo errore:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

E con -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw