Bash: instrucción If / Else en una línea

204

Estoy tratando de verificar si un proceso (supongo que se llama some_process) se está ejecutando en un servidor. Si es así, entonces echo 1, de lo contrario echo 0.

Este es el comando que estoy usando pero solo funciona parcialmente (más información a continuación). Tenga en cuenta que necesito escribir el guión en una línea.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

Nota: El [s]de some_proces[s]es prevenirgrep vuelva en sí.

Si se some_processestá ejecutando, entonces "1"se repite, lo cual está bien. Sin embargo, si some_processno se está ejecutando, no se repite nada.

Arthur Rimbun
fuente
44
Se puede utilizar ps -Ccmdpara encontrar procesos cuyo nombre del comando es "cmd", que pueden eliminar por completo el grep. psestablecerá el código de salida en algún valor distinto de cero si no puede encontrar un proceso de coincidencia.
rici

Respuestas:

273

No hay necesidad de verificar explícitamente $?. Solo haz:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

Tenga en cuenta que esto se basa en que el eco no falla, lo que ciertamente no está garantizado. Una forma más confiable de escribir esto es:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi
William Pursell
fuente
9
Si echo 1falla, echo 0se ejecutará. En este caso, echo 1 nunca fallará, pero tenga en cuenta que A && B || C no es if-then-else. C puede ejecutarse cuando A es verdadero (desde shellcheck ).
schemacs
@schemacs hace un punto muy válido: editar para proporcionar una alternativa mucho mejor.
William Pursell
2
¿Es necesario redirigir la salida del comando ps a un archivo? ¿No funcionaría esto? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. A nivel local parece funcionar para mí. ¿Es porque OP tenía la redirección en el comando que intentó?
1
No hay absolutamente ninguna necesidad de redirigir la salida. Simplemente simulo la posición original, ya que supongo que la salida se está guardando por alguna razón. A menudo, este tipo de cosas simplemente se suprime (con grep -qo redirigido a / dev / null).
William Pursell
Me gustaría utilizar pgrep.
pawciobiel
67

&&significa "y si tiene éxito"; Al colocar su ifestado de cuenta en el lado derecho, se asegura de que solo se ejecutará si se grepdevuelve 0. Para solucionarlo, use ;en su lugar:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(o simplemente use un salto de línea).

ruakh
fuente
66
+1 Esta es una respuesta mucho mejor, ya que en realidad responde la pregunta en lugar de simplemente proporcionar una alternativa.
William Pursell
41

Use grep -vcpara ignorar grepen la pssalida y contar las líneas simultáneamente.

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi
John Gilmer
fuente
15

Puede hacer uso completo de los operadores &&y de ||esta manera:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

Para excluir grep, también puede hacer algo como:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0
Costi Ciudatu
fuente
2
pgrep -q some_process && echo 1 || echo 0

más líneas aquí

una vez
fuente