Eu tenho um script de inicialização mal projetado porque não está em conformidade com oEspecificações básicas padrão do Linux
O seguinte deve ter um código de saída 0 se estiver em execução e 3 se não estiver em execução
service foo status; echo $?
No entanto, devido à forma como o script é projetado, ele sempre retorna 0. Não consigo corrigir o script sem uma reescrita significativa (porque a reinicialização do serviço foo depende do status do serviço foo).
Como você poderia contornar o problema para que service foo status
retornasse 0 se estivesse em execução e 3 se não estivesse em execução?
O que tenho até agora:
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
Responder1
Você está canalizando a grep
saída para wc
e echo $?
retornaria o código de saída para wc
e não grep
.
Você poderia facilmente contornar o problema usando a -q
opção para grep
:
/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?
Se a string desejada não for encontrada, grep
retornaria com um código de saída diferente de zero.
EDITAR: Conforme sugerido porsenhor.espurático, você poderia dizer:
/etc/init.d/foo status | /bin/grep -q "up and running" || (exit 3); echo $?
para retornar com um código de saída 3
se a string não for encontrada.
man grep
poderia dizer:
-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.)