Questo dovrebbe essere vero per qualsiasi shell con controllo del lavoro, che (per la maggior parte) si può dare per scontato a meno che non si tratti di una shell veramente antica. È nello standard POSIX , quindi dash
supporta anche il controllo dei lavori (quando eseguito in modo interattivo o con -m
).
Interactive
- Ctrl+ zsospenderà il programma attualmente in primo piano
bg
metterà in background il programma sospeso più recente
(utilizzare bg %2
con il numero lavoro, che è possibile verificare con jobs
)
fg
metterà in primo piano il programma sospeso più recente
In zsh
, puoi scrivere un'associazione chiave per eseguire implicitamente fg
dal prompt tramite un altro Ctrl+ z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Probabilmente c'è anche un modo intelligente per correre implicitamente bg
alla sospensione, ma sembra poco saggio; almeno per me, la maggior parte del mio Ctrl+ zutilizzo è perché Ctrl+ cnon riesce a scoppiare; Voglio seguirlo con ad es. kill %1
Anziché con bg
, e certamente non voglio per impostazione predefinita uccidere! (Questa logica si estende anche al motivo per cui non uso più questa associazione di tasti: se sto martellando Ctrl+ zper interrompere un processo, l'ultima cosa che voglio che faccia è riprendere!)
Non interattiva
Se ti trovi in una diversa istanza della shell (o in un altro utente, a volte includendo sudo
comandi), probabilmente non sarai in grado di utilizzare i numeri di lavoro.
È ancora possibile agire su un altro processo una volta che si conosce l'ID processo (PID). È possibile ottenere il PID con pgrep …
, o ps aux |grep …
(o dalla stessa shell jobs -l
, o $!
) e quindi eseguire:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Se non si conosce l'ID del processo e non si è preoccupati di sospendere altre istanze del processo per nome, è possibile passare segnali a uno di questi:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Un CONT
segnale ad un programma fermato con Ctrl+ z(e non bg
'd) riprenderà il suo progresso (in primo piano), come se fossi in fg
esso.
Ri: Errore standard
La modifica a questa domanda richiede un errore standard:
Il processo viene emesso su stderr, quindi come devo emettere il comando fg <jobid>
mentre il processo viene inviato al terminale?
A meno che il lavoro in questione non abbia componenti in background (o l'intero lavoro sia in background, forse tramite kill -CONT
), non dovresti effettivamente vedere l'output mentre è sospeso.
Se sta ancora trasmettendo dati (che si tratti dell'output standard o dell'errore standard), renderà sicuramente disordinato il terminale, ma tutto quell'output verrà ignorato poiché non fa parte dell'input. Ciò potrebbe rendere più difficile sapere che non hai inserito alcun refuso, ma la digitazione (alla cieca) fg
Enterdovrebbe essere sufficiente (a meno che tu non abbia più lavori e quello in questione non è il più recente, nel qual caso avrai davvero bisogno del descrittore di lavoro ).
Se è necessario trovare il descrittore di lavoro, utilizzare un altro terminale per inviare il STOP
segnale tramite i metodi non interattivi sopra. Questo dovrebbe liberare il tuo display (forse premere Enteralcune volte o eseguire clear
o Ctrl+ L) in modo da poter quindi eseguire jobs
per trovare il descrittore di lavoro e quindi eseguire fg %N
dove si N
trova quel numero.