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 dashsupporta anche il controllo dei lavori (quando eseguito in modo interattivo o con -m).
Interactive
- Ctrl+ zsospenderà il programma attualmente in primo piano
bgmetterà in background il programma sospeso più recente
(utilizzare bg %2con 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 fgdal 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 bgalla 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 %1Anziché 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 sudocomandi), 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 CONTsegnale ad un programma fermato con Ctrl+ z(e non bg'd) riprenderà il suo progresso (in primo piano), come se fossi in fgesso.
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) fgEnterdovrebbe 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 STOPsegnale tramite i metodi non interattivi sopra. Questo dovrebbe liberare il tuo display (forse premere Enteralcune volte o eseguire clearo Ctrl+ L) in modo da poter quindi eseguire jobsper trovare il descrittore di lavoro e quindi eseguire fg %Ndove si Ntrova quel numero.