Sposta un programma avviato nella schermata GNU su un altro terminale


21

Voglio terminare un'istanza di GNU screenpreservando il processo in esecuzione al suo interno.

Così ho aperto il mio normale programma di emulazione di terminale e ho eseguito la schermata. Quindi ho usato quell'istanza di screenper eseguire ./script_x.sh. Ora, per qualsiasi motivo, voglio smettere di usare, screenma script_x.shnon ha ancora completato il suo compito e non sono disposto a rinunciare ai miei progressi.

Posso mantenere attivo il processo attivo in modo da continuare a lavorarci all'interno del mio normale emulatore di terminale?


14
Vuoi davvero uccidere lo schermo o vuoi staccarti da esso? Lo schermo è pensato per essere utilizzato per eseguire un processo in background in modo da poter continuare nella normale sessione, inoltre consente alle app di continuare a funzionare dopo la disconnessione (ad esempio, disconnettere la sessione SSH). Puoi sempre staccarti dallo schermo, continuare nella sessione normale e riprendere da dove sei rimasto nella sessione dello schermo. L'emulatore di terminale non ha nulla a che fare con questo.
BlueCacti

O semplicemente crea un'altra schermata all'interno della screensessione.
Chrylis

11
Questa domanda ha l'odore del problema XY .
Digital Chris

7
@ tjt263 - in primo luogo dici di pentirti di aver utilizzato lo schermo, quindi cosa faresti per mantenere il processo in esecuzione se non avessi utilizzato lo schermo? Puoi ancora fare la stessa cosa con il processo in schermo, ma lo schermo ha il vantaggio aggiuntivo di poterti staccare da esso e lasciare che il processo venga eseguito indisturbato.
Johnny,

@DigitalChris Potrebbe fare ora. Sento che il titolo originale era molto probabilmente più pertinente. Ci sono 3 punti distinti: stavo eseguendo un programma all'interno screen. Volevo smettere di usare screen. Non volevo interrompere il programma in esecuzione all'interno screen. Questo è tutto. Non so come chiarire la situazione o esprimerla in modo più semplice di così.
voci

Risposte:


31

TLDR: risposta pratica: no

Risposta più lunga:

In teoria puoi. Se hai iniziato qualcosa di simile nohup myprog &dall'interno dello schermo, continuerà a funzionare. Ignorerà un segnale di riaggancio e non avrà alcun input, ma in teoria potresti continuare a lavorarci.

In pratica non è così. Pertanto, a meno che non si desideri collegare un debugger al processo in esecuzione e riscrivere i relativi handle di file e assicurarsi che il processo gestisca i segnali -1 quando si chiude lo schermo ... la risposta è no.

Se sei pronto a farlo, ho un segnalibro a casa che punta a [SU] dove qualcuno ha fatto proprio questo . Risparmiato per la bellezza, non perché è facile e banale da fare.


Nota che la domanda è stata modificata in modo massiccio dalla tua risposta.
Chrylis

La disconnessione di un processo è abbastanza semplice: si tratta di impostare gruppi di processi (con disowno a un livello inferiore) in modo che non SIGHUPvenga inviato quando il processo padre viene interrotto. Ricollegare gli I / O è un'altra cosa: ecco dove entra in gioco il debugger.
alexis

Non è necessario nohupse si è in un guscio di controllo dei job (come bash, ksh, csh, zsh, ash, etc.). Se stai ancora usando una shell di controllo non di lavoro come Bourne, shforse è il momento di aggiornare.
pulcini

23

Puoi provare reptyra ricollegare l'applicazione già in esecuzione su un terminale diverso. Tuttavia, presenta alcuni problemi con l'invio del processo in background.

L'ho appena testato (inizia htopall'interno screen, reptyrsu un altro terminale, uccidi screen), e sembrava funzionare bene. Tuttavia è una soluzione davvero confusa, quindi nessuna garanzia.


1
Meno confuso che usare gdb :)
Hennes

14

Sì (se "uccidere" non sta davvero uccidendo), questo è esattamente lo scopo dello schermo. Dovresti controllare il manuale e provare quale di questi si adatta alle tue esigenze:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

Quindi ti serviranno le opzioni della riga di comando -D / -d -R / -r dello schermo, a seconda della tua scelta.


1
Questo non risponde alla domanda. L'OP non vuole staccarsi dallo schermo, vuole terminare il processo dello schermo.
Guntram Blohm sostiene Monica

6
Sì, lo ha scritto ma non sono sicuro di aver chiesto cosa voleva.
Gombai Sándor,

11
@GuntramBlohm Non è affatto chiaro che l'OP capisca come funziona lo schermo, e questo è l'effetto desiderato più probabilmente.
Chrylis

2
Sei consapevole che lo schermo non è un terminale diverso da xterm ma uno strato (uno pseudo terminale) che può essere collegato al tuo terminale reale (vterm, xterm, terminator, (m) rxvt, any) dopo averlo staccato da qualsiasi altro terminale? E lo schermo è ciò che mantiene in esecuzione il processo in cui è stato avviato all'interno dello schermo (e lo fa bene). Se uccidi (uccidi davvero) lo schermo, quindi estrai il tappeto da sotto il tuo processo ... Non vedo nessuna buona ragione per cui lo faresti.
Gombai Sándor

1
@ GombaiSándor: un motivo per volerlo fare sarebbe quello di far dialogare direttamente il processo con un terminale per passare attraverso funzionalità che lo schermo non conosce. Ad esempio, una volta ho hackerato la mia versione di xterm per fare in modo che tutti gli strani tasti funzione sulla mia tastiera inviassero sequenze di escape che includessero il keyym X11 e lo stato modificatore completo, invece di provare a fingere che fosse un VT102 - e poi ho iniziato l'installazione combinazioni di tasti per loro in emacs. Quelle sequenze non passerebbero attraverso lo schermo incolume.
Henning Makholm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.