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_process
está ejecutando, entonces "1"
se repite, lo cual está bien. Sin embargo, si some_process
no se está ejecutando, no se repite nada.
ps -Ccmd
para encontrar procesos cuyo nombre del comando es "cmd", que pueden eliminar por completo elgrep
.ps
establecerá el código de salida en algún valor distinto de cero si no puede encontrar un proceso de coincidencia.Respuestas:
No hay necesidad de verificar explícitamente
$?
. Solo haz: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:
fuente
echo 1
falla,echo 0
se 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 ).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ó?grep -q
o redirigido a / dev / null).pgrep
.&&
significa "y si tiene éxito"; Al colocar suif
estado de cuenta en el lado derecho, se asegura de que solo se ejecutará si segrep
devuelve0
. Para solucionarlo, use;
en su lugar:(o simplemente use un salto de línea).
fuente
Use
grep -vc
para ignorargrep
en laps
salida y contar las líneas simultáneamente.fuente
Puede hacer uso completo de los operadores
&&
y de||
esta manera:Para excluir grep, también puede hacer algo como:
fuente
más líneas aquí
fuente