Esto debería ser cierto para cualquier shell con control de trabajo, que (en su mayor parte) puede dar por sentado a menos que se trate de un shell verdaderamente antiguo. Está en el estándar POSIX , por lo que incluso dash
admite el control de trabajos (cuando se ejecuta de forma interactiva o con -m
).
Interactivo
- Ctrl+ zsuspenderá el programa actualmente en primer plano
bg
pondrá en segundo plano el programa suspendido más recientemente
(use bg %2
con el número de trabajo, con el que puede verificar jobs
)
fg
pondrá en primer plano el programa suspendido más recientemente
En zsh
, puede escribir un enlace de clave para ejecutar implícitamente fg
desde el indicador a través de otro Ctrl+ z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Probablemente también haya una manera inteligente de correr implícitamente bg
al suspender, pero parece poco sabio; al menos para mí, la mayoría de mi Ctrl+ zuso se debe a que Ctrl+ cestá fallando; Quiero seguir eso con, por ejemplo, en kill %1
lugar de bg
, ¡y ciertamente no quiero dejar de matar por defecto! (Esta lógica también se extiende a por qué ya no uso esta combinación de teclas: si estoy presionando Ctrl+ zpara detener un proceso, ¡lo último que quiero que haga es reanudar!)
No interactivo
Si está en una instancia de shell diferente (o un usuario diferente, a veces incluyendo sudo
comandos), es probable que no pueda usar números de trabajo.
Todavía puede actuar en otro proceso una vez que conoce su ID de proceso (PID). Puede obtener el PID con pgrep …
o ps aux |grep …
(o desde el mismo shell jobs -l
, o $!
) y luego puede ejecutar:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Si no conoce el ID del proceso y no le preocupa suspender otras instancias del proceso por nombre, puede pasar señales a uno de estos:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Una CONT
señal a un programa detenido con Ctrl+ z(y no bg
'd) reanudará su progreso (en primer plano), de la misma manera que si estuviera en fg
él.
Re: Error estándar
La edición de esta pregunta pregunta sobre el error estándar:
El proceso sale a stderr, entonces, ¿cómo debo emitir el comando fg <jobid>
mientras el proceso sale al terminal?
A menos que el trabajo en cuestión tenga componentes que estén en segundo plano (o que todo el trabajo esté en segundo plano, tal vez a través de kill -CONT
), en realidad no debería ver la salida mientras está suspendido.
Si todavía está emitiendo datos (ya sea a la salida estándar o error estándar), ciertamente hará que su terminal esté desordenada visualmente, pero toda esa salida será ignorada ya que no es parte de su entrada. Esto podría hacer que sea más difícil saber que no ha ingresado ningún error tipográfico, pero la escritura (a ciegas) fg
Enterdebería ser suficiente (a menos que tenga varios trabajos y el en cuestión no sea el más reciente, en cuyo caso necesitará el descriptor de trabajo )
Si necesita encontrar el descriptor de trabajo, use otro terminal para enviarle la STOP
señal a través de los métodos no interactivos anteriores. Esto debería liberar su pantalla (quizás presionar Enteralgunas veces o ejecutar clear
o Ctrl+ L) para que pueda ejecutar jobs
para encontrar el descriptor de trabajo y luego ejecutar fg %N
dónde N
está ese número.