Necesito un comando shell / bash independiente de la plataforma (Linux / Unix | OSX) que determinará si se está ejecutando un proceso específico. por ejemplo mysqld
, httpd
... ¿Cuál es la forma / comando más simple de hacer esto?
Si bien pidof
y pgrep
son excelentes herramientas para determinar qué se está ejecutando, ambos, desafortunadamente, no están disponibles en algunos sistemas operativos. Una seguridad definitiva sería utilizar lo siguiente:ps cax | grep command
La salida en Gentoo Linux:
14484? S 0:00 apache2 14667? S 0:00 apache2 19620? Sl 0:00 apache2 21132? Ss 0:04 apache2
La salida en OS X:
42582 ?? Z 0: 00.00 (smbclient) 46529 ?? Z 0: 00.00 (smbclient) 46539 ?? Z 0: 00.00 (smbclient) 46547 ?? Z 0: 00.00 (smbclient) 46586 ?? Z 0: 00.00 (smbclient) 46594 ?? Z 0: 00.00 (smbclient)
Tanto en Linux como en OS X, grep devuelve un código de salida, por lo que es fácil verificar si el proceso se encontró o no:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
Además, si desea la lista de PID, también puede grep fácilmente para ellos:
ps cax | grep httpd | grep -o '^ [] * [0-9] *'
Cuya salida es la misma en Linux y OS X:
3519 3521 3523 3524
El resultado de lo siguiente es una cadena vacía, lo que hace que este enfoque sea seguro para los procesos que no se están ejecutando:
eco ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'
Este enfoque es adecuado para escribir una prueba de cadena vacía simple e incluso iterar a través de los PID descubiertos.
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
Puede probarlo guardándolo en un archivo (llamado "en ejecución") con permisos de ejecución (chmod + x en ejecución) y ejecutándolo con un parámetro: ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
¡¡¡ADVERTENCIA!!!
Tenga en cuenta que simplemente está analizando la salida, lo ps ax
que significa que, como se ve en la salida de Linux, no solo coincide con los procesos, sino también con los argumentos que se pasan a ese programa. Recomiendo encarecidamente ser lo más específico posible al utilizar este método (por ejemplo ./running "mysql"
, también coincidirá con los procesos 'mysqld'). Recomiendo encarecidamente usarlo which
para verificar una ruta completa siempre que sea posible.
Referencias:
grep
También se encontrará en funcionamiento (por ejemplo,ps cax | grep randomname
siempre devolverá 0 porquegrep
hallazgosgrep randomname
(espero que esto está claro ...) Una solución es añadir corchetes alrededor de la primera letra del nombre del proceso, por ejemplo.ps cax | grep [r]andomname
.ps cax | rev | cut -f1 -d' ' | rev
mostrará solo la columna de nombre, para facilitar el análisis.ps cax
puede que no muestre el nombre del comando por completo. Por ejemplo, imprime "chrome-browser" en lugar de "chromium-browser".¡DEBE conocer el PID!
Encontrar un proceso tratando de hacer algún tipo de reconocimiento de patrones en los argumentos del proceso (como
pgrep "mysqld"
) es una estrategia que está condenada al fracaso tarde o temprano. ¿Qué pasa si tienes dos mysqld ejecutándose? Olvídese de ese enfoque. PUEDE hacerlo bien temporalmente y PUEDE funcionar durante uno o dos años, pero luego sucede algo en lo que no ha pensado.Solo el ID de proceso (pid) es verdaderamente único.
Guarde siempre el pid cuando lance algo en segundo plano. En Bash, esto se puede hacer con la
$!
variable Bash. Te ahorrarás TANTOS problemas al hacerlo.Cómo determinar si el proceso se está ejecutando (por pid)
Así que ahora la pregunta es cómo saber si se está ejecutando un pid.
Simplemente haz:
Esto es POSIX y por lo tanto portátil. Devolverá el pid en sí mismo si el proceso se está ejecutando o no devolverá nada si el proceso no se está ejecutando. Estrictamente hablando, el comando devolverá una sola columna, el
pid
, pero dado que le hemos dado un encabezado de título vacío (lo que precede inmediatamente al signo igual) y esta es la única columna solicitada, el comando ps no usará el encabezado en absoluto. Que es lo que queremos porque facilita el análisis.Esto funcionará en Linux, BSD, Solaris, etc.
Otra estrategia sería probar el valor de salida del
ps
comando anterior . Debería ser cero si el proceso se está ejecutando y distinto de cero si no lo está. La especificación POSIX dice queps
debe salir> 0 si se ha producido un error, pero no me queda claro qué constituye "un error". Por lo tanto, personalmente no estoy usando esa estrategia, aunque estoy bastante seguro de que funcionará también en todas las plataformas Unix / Linux.fuente
grep <sometext>
encontrar un proceso dado, entonces has hecho algo mal cuando comenzaste el proceso, en mi humilde opinión. De la pregunta del OP, deduzco que de hecho él tiene control sobre cómo se inicia el proceso.En la mayoría de las distribuciones de Linux, puede usar
pidof
(8).Imprimirá los identificadores de proceso de todas las instancias en ejecución de procesos especificados, o nada si no hay instancias en ejecución.
Por ejemplo, en mi sistema (tengo cuatro instancias de
bash
y una instancia deremmina
ejecución):En otros Unices,
pgrep
o una combinación deps
ygrep
logrará lo mismo, como otros han señalado con razón.fuente
pidof httpd
funciona bien en Red Hat 5. Pero en mi Red Hat 4,pidof
no está presente :-(Esto debería funcionar en la mayoría de versiones de Unix, BSD y Linux:
Probado en:
PATH=...
]fuente
ps
. Para evitar el segundogrep
sugiero:ps aux | grep [h]ttpd
grep
.La forma más sencilla es usar ps y grep:
Si su comando tiene algunos argumentos de comando, también puede poner más 'grep cmd_arg1' después de 'grep $ command' para filtrar otros procesos posibles que no le interesan.
Ejemplo: muéstrame si hay algún proceso java con el argumento proporcionado:
-Djava.util.logging.config.file = logging.properties
Esta corriendo
fuente
ps cax
elimina la necesidad de usargrep -v
. Así, por ejemplo, puede utilizar:ps cax | grep java > /dev/null || echo "Java not running"
.Solo una pequeña adición: si agrega la
-c
bandera a ps, no necesita eliminar la línea que contiene el proceso grep congrep -v
posterioridad. Es decires toda la escritura que necesitará en un sistema bsd-ish (esto incluye MacOSX). Puede dejar de
-u
lado si necesita menos información.En un sistema donde la genética del
ps
comando nativo apunta a SysV, usaríao
para obtener una lista que contenga más que solo pid y nombre de proceso. Por supuesto, puede seleccionar los campos específicos para imprimir usando la
-o <field,field,...>
opción.fuente
Al juntar las diversas sugerencias, la versión más limpia que pude encontrar (sin grep poco confiable que desencadena partes de palabras) es:
kill -0 no mata el proceso, pero verifica si existe y luego devuelve verdadero, si no tiene pidof en su sistema, almacene el pid cuando inicie el proceso:
luego en el guión:
fuente
Lo uso
pgrep -l httpd
pero no estoy seguro de que esté presente en cualquier plataforma ...¿Quién puede confirmar en OSX?
fuente
pidof
por favor? OK lo hiciste. Gracias. Así que deberíamos encontrar algo más que funcione en OSX ... Su básicops|grep
puede ser la solución única ;-)Debe conocer el PID de su proceso.
Cuando lo inicie, su PID se registrará en la
$!
variable. Guarde este PID en un archivo.Luego, deberá verificar si este PID corresponde a un proceso en ejecución. Aquí hay un script esqueleto completo:
Basado en la respuesta de
peterh
. El truco para saber si un PID determinado se está ejecutando está en laps -o pid= -p $PID
instrucción.fuente
Este enfoque se puede utilizar en caso de que los comandos 'ps', 'pidof' y rest no estén disponibles. Yo personalmente uso procfs con mucha frecuencia en mis herramientas / scripts / programas.
Pequeña explicación de lo que está pasando:
fuente
Esto imprime el número de procesos cuyo nombre base es "navegador de cromo":
Si imprime "0", el proceso no se está ejecutando. El comando asume que la ruta del proceso no contiene espacio de ruptura. No he probado esto con procesos suspendidos o procesos zombie.
Probado usando
gwak
comoawk
alternativa en Linux.Aquí hay una solución más versátil con algunos ejemplos de uso:
fuente
Aquí está mi versión. caracteristicas:
guión:
fuente
Ninguna de las respuestas funcionó para mí, así que aquí está la mía:
Explicación:
Esto elimina el retorno de carro creado por el terminal. El resto se puede explicar en este artículo .
fuente
La siguiente función de shell, que solo se basa en los comandos y opciones estándar POSIX, debería funcionar en la mayoría (si no en alguno) de los sistemas Unix y Linux. :
Tenga en cuenta que se bloqueará cuando se le pase el dudoso nombre de comando "0]" y tampoco podrá identificar los procesos que tengan un espacio incrustado en sus nombres.
Tenga en cuenta también que la solución más votada y aceptada exige
ps
opciones no portátiles y utiliza gratuitamente un shell que, a pesar de su popularidad, no se garantiza que esté presente en todas las máquinas Unix / Linux (bash
)fuente
$ isPidRunning 0]
imprime, por ejemplo, "0] se está ejecutando 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [migración / 0] 35 [watchdog / 0]" aquí.