Tengo un script de inicio que está mal diseñado porque no se ajusta a lasEspecificaciones básicas estándar de Linux
Lo siguiente debe tener un código de salida de 0 si se está ejecutando y 3 si no se está ejecutando.
service foo status; echo $?
Sin embargo, debido a la forma en que está diseñado el script, siempre devuelve un 0. No puedo arreglar el script sin una reescritura significativa (porque el reinicio del servicio foo depende del estado del servicio foo).
¿Cómo podría solucionar el problema para que service foo status
devuelva un 0 si se está ejecutando y un 3 si no se está ejecutando?
Lo que tengo hasta ahora:
root@foo:/vagrant# service foo start
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l
1
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l;echo $?
0 # <looks good so far
root@foo:/vagrant# service foo stop
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l
0
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l;echo $?
0 # <I need this to be a 3, not a 0
Respuesta1
Está canalizando la grep
salida wc
y echo $?
devolvería el código de salida para wc
y no grep
.
Podrías solucionar fácilmente el problema utilizando la -q
opción para grep
:
/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?
Si no se encuentra la cadena deseada, grep
regresará con un código de salida distinto de cero.
EDITAR: Como lo sugiereseñor espurático, tu puedes decir:
/etc/init.d/foo status | /bin/grep -q "up and running" || (exit 3); echo $?
para regresar con un código de salida de 3
si no se encuentra la cadena.
man grep
diría:
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit
immediately with zero status if any match is found, even if an
error was detected. Also see the -s or --no-messages option.
(-q is specified by POSIX.)