En la línea de comando, escribí un comando y presioné enter. No da salida a nada. ¿Cómo puedo saber si se está ejecutando y aún no se emite, o si está solicitando la entrada del usuario?
command-line
process
io
Gqqnbig
fuente
fuente
PS1
aviso.cat
comando. Simplemente escribacat
por sí mismo y esperará la entrada de stdin, pero no da ningún aviso. Muchos otros comandos se comportan de manera similar porque esperan la entrada de stdin o de un archivo, pero no diferencian entre diferentes fuentes de entrada (terminal interactiva, tubería, archivo ...).Respuestas:
Hay varios enfoques:
Intente señalar el final de la entrada : sin privilegios de superusuario, es difícil saber qué está sucediendo debajo del capó. Lo que se puede hacer es presionar Ctrl+ d. Los terminales y las utilidades en modo canónico envían todo el texto disponible a
read()
syscall al recibir la señal EOT vinculada a esta combinación de teclas, y si no hay entrada,read()
devuelve el estado de salida negativo que la mayoría de las utilidades aceptan como señal de salida. Por lo tanto, si una utilidad está esperando la entrada, saldrá al recibir la combinación de teclas. De lo contrario, la utilidad está ejecutando tareas o no está escrita correctamente.Espiar llamadas de sistema : si tiene privilegios de superusuario, puede ejecutar
strace
en otro terminal para ver lo que se está haciendo actualmente. Para eso necesitas averiguar el PID del programa. Por ejemplo, en otra pestaña de terminal ejecutepgrep -f firefox
que puede 1234 como ejemplo y luegosudo strace -f -p 1234
. Si la salida que ve está atascada enread()
syscall, significa que el comando probablemente esté esperando entrada. De lo contrario, si ve syscalls corriendo, entonces el comando está haciendo otra cosa. Consulte una pregunta relacionada para usarstrace
también para averiguar si el comando de ejecución prolongada ha salido.Utilice los métodos propios del comando : entre otras cosas, utilidades como las
dd
señales de uso. Por ejemplo, si usakill -USR1 1234
(donde 1234 es PID deldd
comando en ejecución ), se imprimirá para almacenar la cantidad de bytes procesados actualmente. Por supuesto, esto requiere saber sobre tal comportamiento del comando en primer lugar. Los dos métodos anteriores son más generales y no requieren un conocimiento profundo del comportamiento de cada comando (aunque siempre es mejor saber lo que realmente está ejecutando; de lo contrario, corre el riesgo de ejecutar un comando que puede dañar).fuente
strace
método :-) Pero los métodos más simples también son útiles (generales o específicos para cada programa). Algunos de ellos funcionan sin privilegios de superusuario. Ejemplos: verifique sidd
está haciendo algo y verifique por quégrep --color asdf
está esperando en silencio.dd
que agregaré ese.Cómo saber si un programa se está ejecutando o si desea la entrada del usuario
Depende del programa y de cómo lo invoques.
A menudo, pero no siempre, habrá un mensaje que indica que el programa está solicitando información.
Si no está seguro, puede verificar si el proceso del programa está ocupado
usa CPU - usa
top
ohtop
lee o escribe - use
sudo iotop -o
Y cuando el programa haya finalizado, verá el indicador del shell.
Shellscript
running
Tenía un shellscript que verifica si un programa se está ejecutando, y ahora he agregado la opción
-s
para que se ejecutesudo strace -f -p <PID>
(según la respuesta de Sergiy Kolodyazhnyy) cuando se encuentra un ...El shellscript usa
ps -ef
para encontrar la mayoría de los programassystemctl is-active --quiet
para encontrar algunos programasy si lo deseas
strace
en unaxterm
ventana.Instale
xterm
si desea usarstrace
para ver la actividad de un programa.Uso
Puede instalar el shellscript
running
en un directorioPATH
si desea acceder fácilmente a él.El código shellscript
Manifestación
Comprobando las ventanas de terminal en Lubuntu (LXTerminal comenzó como
x-terminal-emulator
ygnome-terminal
ventanas personalizadas ),Hay mucha actividad tan pronto como el cursor está en la ventana de terminal.
Iniciando
grep
(esperando la entrada de/dev/stdin
)Comprobándolo
No hay mucha actividad y puedes identificar lo que está sucediendo.
fuente
iotop
, aunque el uso de la CPU no necesariamente sea un indicador si un proceso está ocupado. Un programa escrito en C y optimizado podría estar usando una CPU mínima. Algunos de los indicadores que he escrito en Python programan una tarea repetida para ejecutarse, por lo que podría usar la CPU para actualizar el menú del indicador por un breve momento y luego simplemente se queda allí.strace
método es mejor, pero quizás no sea necesario o no esté disponible.No estoy seguro si todavía necesita esto, pero sigue siendo un truco útil para saber: si el programa parece salir sin ningún resultado, puede verificar si se está ejecutando en segundo plano ejecutando
¡Salud!
fuente
Si está ejecutando el shell en una terminal, por ejemplo, un emulador de terminal o una sesión ssh típica, su shell seguramente ha habilitado el control de trabajos. Esto hace que obtener una respuesta a su pregunta sea muy fácil en la mayoría de los casos.
Escriba Ctrl+Zpara suspender el proceso y luego
bg
continuarlo en segundo plano, luego escriba una línea vacía al shell para que verifique si el programa se detuvo por una señal.Si el proceso está tratando de leer desde la terminal, inmediatamente recibirá una
SIGTTIN
señal y se suspenderá. (Cuando el control de trabajo está habilitado, el sistema solo permite leer un proceso a la vez desde el terminal). El shell informará esto. Luego puede escribirfg
para continuar el proceso en primer plano y luego escribir la entrada para que el programa la lea de manera normal.Algunos programas, como los editores, atrapan o ignoran la señal generada por Ctrl+Zel terminal o lo ponen en un modo donde los caracteres de control ni siquiera generan señales. Tendrá que utilizar técnicas más avanzadas en este caso, como el uso
strace
para ver si el proceso está haciendoread
,select
,poll
, etc.fuente