grep schlägt im Upstart-Skript fehl

2286
Thorsten Schöning

Ich habe eine Upstart-Konfiguration für einen Dienst, der die Existenz eines Prozesses beim Start überprüfen muss. Das klingt ziemlich einfach, aber ich versuche bereits 3 Stunden, um dieses Problem zu lösen, und ich bin verloren. Das Problem scheint zu sein, dass einige grep-Anweisungen zu einem Exit des Skripts innerhalb von upstart führen, was zu einem Fehler beim Starten des Dienstes führt. Upstart protokolliert jedoch nichts, es beendet nur das Skript und ist weg.

Nachfolgend einige Beispielzeilen, die das Problem auslösen: Das erste Echo und die Ausgabe seines grep werden protokolliert, das zweite Echo wird protokolliert, nicht jedoch die Ausgabe seines grep. Nach dem zweiten Echo-Start wird das Skript einfach beendet und gestoppt. Das Problem besteht darin, die Option -v oder eine andere Funktion wie das Verwenden von Regex-Klassen wie [[: digit:]] hinzuzufügen. Es scheint, als müsste ich einigen Charakteren entkommen, aber ich weiß einfach nicht wie. Ein einfaches -v oder so etwas funktioniert nicht.

script echo grep ps ax | grep "postgres: wal writer process" | grep "grep" echo grep2 ps ax | grep "postgres: wal writer process" | grep -v "grep" end script 

Hat jemand eine Idee, was ich falsch mache und wie ich das Problem beheben kann?

4

1 Antwort auf die Frage

5
tripleee

As explained in the manual, all scripts run with sh -e. That means any unhandled command failure will terminate the script with an error. If you have code which might return failure, you would code it like

command || true 

or wrap it in a conditional or something.

By the by, your code is better written as

ps ax | grep "[p]ostgres: wal writer process" 

See also https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

So in summary, you would probably be looking for something like

if ps aux | grep '[p]ostgres: wal writer process' then : already running else : start it up fi 

Now that grep is run as part of a conditional, a failure is no longer considered unhandled (even if you don't have an else clause!) and so it will run safely under set -e.

Ihre Aussage funktioniert auch nicht, aber ich glaube, ich verstehe jetzt den Grund: Die Aussage soll fehlschlagen, wenn sie keine übereinstimmenden Zeilen findet, was ein völlig gültiger Fall ist. Nach den grep-Anweisungen habe ich ein if, das den Fehlercode der letzten Anweisung überprüft, aber wegen eines Fehlercodes von 1, wenn die Mathing-Zeile nicht gefunden wird und "sh -e" das If nie erreicht wird. Es gibt nichts falsch mit Fluchtzeichen oder sonst. vor 11 Jahren 0
Sie sollten `grep foo bar 'reparieren; wenn [$? = 0]; dann ... zu dem einfacheren, robusteren und idiomatischeren 'if grep foo bar; dann ... tripleee vor 11 Jahren 1
Ich konnte so etwas nicht wie `if [ps ax | grep "postgres: wal writer process" | grep -v "grep"] `oder` if [ps ax | grep "[p] ostgres: wal writer process"] `auch ohne [] bilden das if und escated | oder [p] um zu arbeiten. vor 11 Jahren 0
Siehe auch http://stackoverflow.com/questions/10586213/encounter-unary-operator-expected-in-bash-script/10586252#10586252 tripleee vor 11 Jahren 0
Oder, wenn ps aux | grep "[p] ostgres: wal writer process"; dann ... und beachten Sie insbesondere das Fehlen eckiger Klammern um die Befehle. tripleee vor 11 Jahren 1
Sie haben recht, die [] waren das Problem. Ich habe es vorher ohne probiert, aber vielleicht hat es nicht funktioniert, weil meine Upstart-Konfiguration einen symbolischen Link verwendet und nach meinen Änderungen nicht aktualisiert wurde. Jetzt gehts. Danke vielmals! vor 11 Jahren 0