Ich habe ein Init-Skript, das schlecht entworfen ist, weil es nicht denLinux Standard-Basisspezifikationen
Folgendes sollte einen Exit-Code von 0 haben, wenn es ausgeführt wird, und 3, wenn es nicht ausgeführt wird
service foo status; echo $?
Aufgrund der Art und Weise, wie das Skript konzipiert ist, gibt es jedoch immer eine 0 zurück. Ich kann das Skript nicht reparieren, ohne es erheblich umzuschreiben (weil der Neustart des Dienstes Foo vom Status des Dienstes Foo abhängig ist).
Wie könnten Sie das Problem umgehen, sodass service foo status
bei Ausführung eine 0 und bei Nichtausführung eine 3 zurückgegeben wird?
Was ich bisher habe:
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
Antwort1
Sie leiten die grep
Ausgabe an weiter wc
und echo $?
würden den Exitcode für wc
und nicht zurückgeben grep
.
Sie können das Problem leicht umgehen, indem Sie die -q
Option für Folgendes verwenden grep
:
/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?
Wenn die gewünschte Zeichenfolge nicht gefunden wird, grep
wird ein Exit-Code ungleich Null zurückgegeben.
EDIT: Wie vorgeschlagen vonHerr Spuratic, du könntest sagen:
/etc/init.d/foo status | /bin/grep -q "up and running" || (exit 3); echo $?
um mit einem Exit-Code zurückzukehren, 3
wenn die Zeichenfolge nicht gefunden wird.
man grep
würde sagen:
-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.)