¿Cómo saber qué comando se está ejecutando sin detenerlo?

20

En mi ejemplo, estoy ejecutando un comando que tarda mucho en ejecutarse (varias horas).

Realmente no recuerdo si ingresé make o make -j4.

Por supuesto, podría detenerlo y presionar la tecla hacia arriba o verificar el historial para saberlo, pero eso detendría el proceso y no quiero que eso suceda (en caso de que ya esté haciendo make -j4).

¿Hay alguna manera de saber qué comando se está ejecutando sin detener el proceso?

Daniel Viaño
fuente
55
Desde otra terminal, intentepgrep -a make
John1024
2
En el caso de makeque pueda detenerlo y reiniciarlo, debería continuar donde lo dejó.
user253751

Respuestas:

34

Si desea ver la línea de comando completa para cada instancia makeque se está ejecutando en su computadora, abra una nueva terminal e intente:

pgrep -a make

pgrepes un programa que busca a través de todos los procesos en su computadora. En este caso, está buscando programas con nombre make. La opción -ale indica pgrepque enumere tanto la ID del proceso como la línea de comando completa para cada proceso coincidente. (Sin -a, simplemente devolvería la ID del proceso). Para obtener más información sobre las muchas opciones de pgrep, consulte man pgrep.

John1024
fuente
77
Esto es útil para casos simples como el de la pregunta. Sin embargo, si el comando involucra tuberías, bucles, secuencias de comandos, comandos internos o expansión variable, lo que encontraría con pgrepsería diferente del comando que se escribió en la línea de comando.
kasperd
28

Mientras la ventana de terminal está activa, puede pausar (suspender) el proceso presionando Ctrl+ Z. Luego puede empujar el trabajo en segundo plano escribiendo bg(su trabajo ahora continuará en segundo plano y al mismo tiempo puede trabajar en la línea de comando; esto es equivalente a comenzar un trabajo &al final de la línea de comando). Luego use las flechas del cursor (arriba y abajo) para ver qué comando usó. Si lo desea (pero esto no es necesario), puede obtener su trabajo en primer plano escribiendo fg.

Stefan
fuente
77
Esto funciona con algunos comandos pero no con todos. Por ejemplo, si escribiste un bucle como for X in {1..1000} ; do sleep $X ; doneese, el bucle se interrumpiría y las iteraciones restantes no sucederían.
kasperd
11
@kasperd Sí, bastante molesto si me preguntas, pero descubrí una solución interesante para ese problema. Rodea un comando complicado como ese entre paréntesis, por lo que es una subshell. Luego, Ctrl-Z suspenderá toda la subshell y se reanudará correctamente.
penguin359
@kasperd No en bash, pero sí en zsh.
JoL
44
No es necesario poner el trabajo en segundo plano: es suficiente suspenderlo, verificar el historial (o jobs, como se muestra en la respuesta de @ ichabod), y luego reanudarlo a través de fg.
Konrad Rudolph el
10

Hago algo como Stefan: ^ Z para pausar el trabajo, y luego corro jobs. Si tiene varios procesos en ejecución, es posible que tenga que clasificar qué trabajo fue el que detuvo, pero esto generalmente le dará la línea de comando. Luego corre fgpara continuar la ejecución.

ichabod
fuente
1

Una buena manera de ver esto dinámicamente es ejecutar top, y esto le indica el estado general del sistema y los procesos en ejecución en el sistema.

Hacer un 'ps ux' muestra sus procesos junto con pid y otra información, puede usar la habilidad para eliminar algunos de ellos si lo desea, la página de manual para eso es un buen recurso, y hacer una habilidad o matar -9 obtiene procesos pegajosos colgado en el dispositivo, espera, etc. También puede enviar otras señales a procesos como -hup, reinicia los demonios, etc.

La parte superior es agradable ya que muestra el tamaño del proceso, el tiempo transcurrido y los estados actuales de la CPU y el de la memoria y el intercambio.

A menudo hago $ make> & make.out & y luego less o tail -f en el archivo de registro make.out. Desde ahora, make se separa como un proceso de mi sesión de shell.


fuente