Cómo verificar si el proceso ya se está ejecutando o no

32

Quiero verificar el proceso en particular en ejecución o no.

Yo arbitré estas preguntas y respuestas .

Pero no obtuve ninguna solución específica. El siguiente es el ejemplo que probé: he creado un abc.sharchivo y ejecuto este script en segundo plano, como sh abc.sh &.

Ahora este archivo se ejecuta en segundo plano y disparo el ps aux | grep "abc"comando.

A continuación se muestra el resultado de este comando:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Después de eso detengo el abc.shscript en ejecución y disparo el mismo ps aux | grep "abc"comando.

Pero estoy obteniendo la misma salida como:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

¿Hay alguna otra forma de encontrar que el proceso se está ejecutando o no?

Prakash V Holkar
fuente

Respuestas:

41

Todos los procesos se enumerarán en la salida de ps aux; ya sea corriendo, durmiendo, zombie o parado.

Sin embargo, en su caso, dado que ejecutó el proceso usando sh abc.sh, shes la aplicación (shell) la que se está ejecutando y no abc.sh. Por lo tanto, ps auxno contendrá el proceso abc.shdebido a que grepno podría dar ningún resultado.

Entonces, la forma correcta en que debería haberlo usado es como:

ps aux | grep sh

Esto también puede devolverle otro proceso que se está ejecutando con la cadena shen cualquier lugar de su salida de ps aux.

Debe tener en cuenta que el proceso se "ejecutará" cuando la salida de ps auxtenga su STATcomo R. Si es algo diferente a eso, no se está ejecutando en la instancia en la que activó el comando para verificar los procesos en ejecución. Los diferentes estados del proceso se pueden encontrar en la página del manual para ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

También podría ejecutar el topcomando para verificar si el proceso se está ejecutando o inactivo y la cantidad de CPU, RAM que está consumiendo. (Esto volverá a enumerar su proceso como sh).

Sin embargo, si desea que su proceso aparezca en la lista abc.sh, entonces debe tener la primera línea del script que está ejecutando como:

#!/bin/sh

para que el shell sepa qué aplicación usar para ejecutar el script (sh en este caso, cámbielo a #!/bin/bashbash) y luego proporcionará permisos ejecutables para el proceso usando:

chmod +x /path/to/abc.sh

reemplazar /path/to/con la ubicación del abc.sharchivo y luego ejecutar abc.shusando

/path/to/abc.sh

nuevamente reemplazando /path/to/con la ubicación del abc.sharchivo.

Jobin
fuente
2
Una pregunta rapida. ¿Qué S+significa estadística?
Prakash V Holkar
Pero puede encontrar la diferencia entre ejecutar procesos y no ejecutar procesos a través de la salida del ps aux | grep filenamecomando.
Avinash Raj
@TechGuru: Significa que el proceso está suspendido en primer plano, consulte la página del manual de ps para obtener más información.
trabajoin
@AvinashRaj: Sí, por supuesto que puedes.
trabajoin
Me sale un error: Error, haz esto: mount -t proc proc / proc
IgorGanapolsky
7

Mi problema grepes que es un analizador de línea completa. En su ejemplo, está buscando "abc" pero está retirando la instancia de grep(que está buscando "abc"). Un poco circular. Puedes filtrar eso, pero me parece un poco perverso.

Me gustaría recurrir a awkun poco de garbo.

ps aux | awk '$12=="abc.sh"'

awkdivide las líneas en campos basados ​​en espacios en blanco (por defecto). Los campos $ 11 + son la (s) columna (s) de comando, por lo que si el comando es "sh abc.sh ...", $11será shy $12será abc.sh.

Si desea controlar la salida o la cadena con Bash &&y ||operadores, puede hacerlo, pero deberá ser un poco más inteligente. grepsaldrá con el código de estado 1 (falla técnica, disparadores ||) si no se encuentra nada, pero awksiempre saldrá del código 0. Podemos cambiar esto diciéndole que salga si encuentra algo y arroje un 1 si no lo hace:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Por supuesto, si solo le interesa escribir la salida en la pantalla, puede hacerlo todo en awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
Oli
fuente
4

La forma correcta de verificar en la sesión bash actual si un proceso iniciado en segundo plano, como si sh abc.sh &ya se está ejecutando o no, es usar el jobscomando incorporado.

Ejemplo:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Eso significa que el sh abc.shproceso iniciado en segundo plano se está ejecutando. Si el proceso ha terminado, verá algo como:

[1]+  Done                    sh abc.sh

Si tiene más procesos ejecutándose en segundo plano, puede restringir la salida solo al sh abc.shproceso mediante:

jobs sh

Ver help jobspara más información.

El método anterior solo funcionará en la sesión actual de bash. Pero si está en otra sesión de bash (por ejemplo, en otra ventana o pestaña de terminal, o en un script), aparte de:

ps aux | grep "[s]h bin/test.sh"

puedes usar también:

pgrep -a sh

lo cual me parece más simple. Si verá su comando escrito en la salida ( sh abc.shen este caso), eso significa que el proceso aún se está ejecutando. Si no, el proceso ha terminado.

Radu Rădeanu
fuente
3

Si su script se está ejecutando actualmente, debe mostrarse por ps auxcomando. Si no se muestra ps, entonces puede que la ejecución de su script finalice actualmente.

La salida de pseste tipo significa que su script no se está ejecutando actualmente,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Si se muestra así, lo que significa que su script se está ejecutando actualmente.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Todo se basa en el contenido del guión.

Por ejemplo, si crea un script como este. Muestra el mensaje HI en la ejecución. Se tarda unos segundos en mostrar la salida y se termina después de que produce el resultado final.

#!/bin/bash
echo "HI"

Pero si tu guión es así,

#!/bin/bash
sudo apt-get update

Lleva algunos minutos terminar el proceso. Mientras tanto, si ejecuta el ps aux | grep filenamecomando, se mostrará en la salida. Porque el script se está ejecutando actualmente.

Avinash Raj
fuente
-2
  • si desea verificar todos los procesos, use 'top'

  • si desea conocer los procesos ejecutados por java, use ps -ef | grep java

  • si otro proceso, entonces simplemente use ps -ef | grep xyzo simplemente/etc/init.d xyz status

  • si a través de cualquier código como .shentonces./xyz.sh status

Umman
fuente
1
-1 Si bien estos comandos son útiles en algunas circunstancias, seguirán siendo inútiles para alguien que no conoce estas circunstancias. En cada caso, o no los explica lo suficiente o su explicación es incorrecta.
David Foerster
-2

si simplemente desea verificar si hay alguno en proceso, vaya a ese directorio y escriba ll -trsi ve .csvo .worketc. al final del archivo, entonces significa que no está en proceso.

Umman
fuente
Esta respuesta no tiene sentido. Listar el contenido de un directorio no le dirá si se está ejecutando un proceso. La extensión del archivo .csves para archivos delimitados por comas que no están relacionados con un proceso en ejecución.
user369450