È possibile mettere in background il processo in primo piano senza sospendere (control + z)?


11

Sto eseguendo un'applicazione che riceve i pacchetti TCP e UDP e quindi non può essere sospeso. Ho eseguito inizialmente 3 processi della stessa applicazione, con argomenti diversi, in modalità background usando &. Quando ho fatto solo $fg, tutti e tre i processi sono entrati in primo piano. Ora voglio inviarli di nuovo in background ma senza sospensione. Come lo posso fare?


Ecco un argomento ServerFault sullo spostamento di un processo in esecuzione in una nuova istanza dello schermo -> serverfault.com/questions/55880/…
Alan Barber,

Risposte:


10

Per prima cosa: può esserci un solo processo in primo piano, non tutti e tre. fgporta in primo piano l'ultimo processo. Per rendere il processo di Ctrl+ z, quindi digitare bgpiù velocemente per non "disturbare" l'applicazione in questione (si noti che lo scheduler del processo lo farà comunque più volte al secondo), scoprire il PID del processo in primo piano, quindi in un secondo terminale / Sessione SSH, utilizzare

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

Il tuo terminale originale dirà stopped, ma dal momento che hai inviato SIGCONTsubito, il processo continuerà a essere eseguito in background.


1
@stefen: la tua soluzione è convincente. Non danneggerà in alcun modo i miei processi, supponendo che se sospendiamo il processo, le connessioni socket stabilite non si interrompono (la commutazione dello scheduler non disconnette la connessione socket, questo è sicuro). Eseguirà il debug di questo e si aggiornerà. Molte grazie. Se
rahul.deshmukhpatil,

2

Se hai davvero un lavoro in primo piano, allora bash sta aspettando che venga completato, è più o meno la definizione di un lavoro in primo piano . Se bash ha ancora il controllo del terminale, controlla cosa sta succedendo jobs -l, ad esempio:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

Per questo ho avviato tre ncatprocessi di ascolto in background . È inoltre possibile che venga visualizzato "Fine" o "Interrotto" per lo stato di un processo.

È possibile eseguire in background un lavoro in primo piano da una shell diversa utilizzando il metodo SIGSTOP / SIGCONT di Stefan Seidel (sebbene il segnale effettivo inviato da una shell con Ctrl- Zsia SIGTSTP, entrambi i segnali dovrebbero funzionare).

Esiste una sottile distinzione tra processi e lavori quando vengono utilizzati i termini primo piano e sfondo. Esiste un solo processo di primo piano della shell , possono esserci più processi di primo piano (ciò è correlato agli ID dei gruppi di processi del terminale e può essere osservato quando si avviano due o più processi in una pipeline).

Un processo in esecuzione o una pipeline sotto il controllo della shell viene definito "lavoro", quando si utilizza il comando bgo fgsi fa riferimento implicito al lavoro più recente, nel mio caso quello con +il precedente. Questi lavori possono anche (tra le altre cose) essere definiti esplicitamente come% 1% 2 o% 3 (il numero in []).

Un fgcomando non qualificato avrà effetto solo su un lavoro, il più recente, quindi potresti sbagliarti nella comprensione della situazione attuale. Un lavoro in background può ancora scrivere sul terminale:

  echo foo > /dev/tcp/127.0.0.1/10111

Può dipendere da come il programma gestisce il terminale, ncatfunziona bene per la scrittura. Per leggere però i programmi interromperanno l'esecuzione e vedrai un messaggio "Interrotto". La shell avvierà i processi e aspetterà che escano o ricevano un segnale SIGTTIN ( nohupè un modo per aggirare questo, così com'è disown).

È possibile eseguire il background di un lavoro interrotto specifico con

$ bg %3

(nel mio caso visualizzerò l'errore bash: bg: job 3 already in background)

Altrimenti se un processo è in primo piano, a meno che il programma non catturi SIGTSTP e faccia qualcosa di speciale, è improbabile che si verifichino problemi con un veloce Ctrl- Ze bg. Non c'è nulla di speciale nei programmi di rete in questo senso, le connessioni / i dati in entrata saranno bufferizzati dal kernel (fino a un certo punto). Una connessione di streaming può tuttavia presentare una pausa osservabile.

Vedere la sezione " CONTROLLO LAVORO " della pagina man di bash per maggiori dettagli.


1

Il modo più semplice per farlo è utilizzare il programma dello schermo . È possibile avviare l'applicazione all'interno del terminale virtuale, quindi uscire dalla schermata con Ctrl + A, D. Se vuoi riprendere la sessione, il tuo tipo screen -x. Se hai più processi, ti verrà presentato un elenco di schermate a cui ricollegarti. Per maggiori dettagli, leggere la pagina man dello schermo .


5
Penso che stia cercando una soluzione "dopo il fatto", cioè i processi sono in esecuzione proprio ora.
Stefan Seidel,
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.