Ci sono lavori interrotti (all'uscita bash)


158

Ricevo il messaggio There are stopped jobs.quando provo a uscire da una shell bash a volte. Ecco uno scenario riproducibile in Python 2.x:

  • ctrl+ cè gestito dall'interprete come eccezione.
  • ctrl+ z'arresta' il processo.
  • ctrl+ desce da Python per davvero.

Ecco alcuni output del terminale nel mondo reale:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash non è uscito, devo di exitnuovo uscire dalla shell bash.

  • D: Cos'è un "lavoro interrotto" o cosa significa?
  • D: È possibile riprendere un processo interrotto?
  • D: Il primo exituccide i lavori interrotti?
  • D: C'è un modo per uscire dalla shell la prima volta? (senza entrare exitdue volte)

ctrl + shift + \ farà anche uscire da Python.
ThorSummoner,

Risposte:


206

Un lavoro interrotto è uno che è stato temporaneamente messo in background e non è più in esecuzione, ma utilizza comunque risorse (ad es. Memoria di sistema). Poiché quel lavoro non è collegato al terminale corrente, non può produrre output e non riceve input dall'utente.

Puoi vedere i lavori che hai in esecuzione usando il jobscomando incorporato in bash, probabilmente anche altre shell. Esempio:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

È possibile riprendere un lavoro interrotto utilizzando il fgcomando incorporato (in primo piano) bash. Se si dispone di più comandi che sono stati arrestati, è necessario specificare quale riprendere passando il numero di jobspec sulla riga di comando con fg. Se viene arrestato un solo programma, è possibile utilizzare fgda solo:

user@mysystem:~$ fg 1
python

A questo punto sei tornato nell'interprete Python e puoi uscire usando control-D.

Al contrario, è possibile killil comando con jobspec o PID. Per esempio:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Per utilizzare jobspec, precedere il numero con il tasto percentuale (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Se si emette un comando di uscita con lavori interrotti, verrà visualizzato l'avviso visualizzato. I lavori verranno lasciati in esecuzione per sicurezza. Questo per assicurarti di essere consapevole che stai tentando di uccidere lavori che potresti aver dimenticato di aver smesso. La seconda volta che si utilizza il comando exit, i lavori vengono terminati e la shell viene chiusa. Ciò può causare problemi per alcuni programmi che non sono destinati a essere uccisi in questo modo.

In bash sembra che tu possa usare il logoutcomando che ucciderà i processi arrestati e uscirà. Ciò può causare risultati indesiderati.

Si noti inoltre che alcuni programmi potrebbero non uscire al termine in questo modo e il sistema potrebbe finire con molti processi orfani che utilizzano risorse se si prende l'abitudine di farlo.

Si noti che è possibile creare un processo in background che si interromperà se richiedono l'input dell'utente:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

È possibile riprendere e terminare questi lavori nello stesso modo in cui sono stati interrotti i lavori Ctrl-zinterrotti.


4
Vorrei cavillare con la tua seconda frase. Dovrebbe essere visualizzato il messaggio "Poiché il lavoro è stato interrotto , non può eseguire alcuna azione: I / O dei file, I / O di rete, I / O del terminale o qualsiasi altra elaborazione".
Scott

2
Questo mi aiuta molto.
shellbye

Post eccellente, un grande aiuto per chiunque!
George Udosen,

18

D: Cos'è un "lavoro interrotto" o cosa significa?

Il lavoro interrotto indica un processo che ha ricevuto il segnale di arresto ( SIGSTOP/ SIGTSTP) dalla tastiera (carattere di sospensione Ctrl-Z), comando (ad es. kill -STOP [PID]) O un altro processo (ad es. Kernel quando il sistema è carente di risorse) ed è in stato di pausa, quindi indica al sistema di arrestare / sospendere un processo in modo da non eseguire alcuna esecuzione / elaborazione.

Lavori Active Shell possono essere elencate: jobs.

D: È possibile riprendere un processo interrotto?

Il processo interrotto riprenderà la sua esecuzione solo se viene inviato il SIGCONTsegnale. Ciò può essere ottenuto mediante fg(o fg ID) che sposta il lavoro in primo piano rendendolo il lavoro corrente, bgper continuarlo in background o inviando un SIGCONTsegnale (ad es kill -CONT [PID].).

D: La prima uscita uccide i lavori interrotti?

La prima volta che si digita exit/ logouto si preme Ctrl-D, la shell stampa un messaggio di avviso sui lavori attivi correnti associati al proprio terminale, quindi non ucciderà quelli senza il proprio consenso confermando l'azione una seconda volta. Se l' checkjobsopzione è abilitata ( shopt -s checkjobs), può anche elencare i lavori con i loro stati.

D: C'è un modo per uscire dalla shell la prima volta? (senza entrare due volte in uscita)

È possibile premere Ctrl+Ddue volte o tenerlo premuto più a lungo, in questo modo si uscirà rapidamente dalla shell uccidendo gli attuali lavori di arresto / esecuzione in corso.

In alternativa li rinnegare ( disown) di lasciare loro o ucciderli manualmente: kill $(jobs -p).

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.