2016-05-05 16 views
0

Mein Skript funktioniert nicht richtig, wenn ich mit nur sh ausführen, funktionierte es früher gut bis heute. Selbst im Cronjob wurde es problemlos ausgeführt.Skript wird nicht korrekt ausgeführt, wenn/bin/sh verwendet

/bin/sh process_check.sh 

Aber es scheint in Ordnung auszuführen, wenn ich mit der folgenden Art und Weise ausführen

./process_check.sh 

Script (prüft, ob ein Prozess ausgeführt wird, führt den Prozess, wenn es nicht läuft)

#/bin/sh 
    $service=xxx 

    if (($(/bin/ps -ef | grep $service | wc -l) > 1)) 
     then 
     true 
     else 
     echo "$service is not running!!!" 
     /usr/sbin/xxx 
     fi 

Gibt es auch Möglichkeiten, dies viel effizienter zu machen? Ich habe ein kompiliertes Programm, das ich versuche sicherzustellen, läuft immer.

+0

Statt 'if (($ (/ bin/ps-ef | grep $ service | wc -l)> 1)); dann versuche das viel einfachere: 'if/bin/ps -ef | grep -q $ service; dann " –

+0

@WilliamPursell Es gibt ein Problem damit. Selbst wenn '$ service' nicht läuft, kann der Prozess' grep -q $ service' in der 'ps' Ausgabe enthalten sein. Aus diesem Grund wurde im OP-Code nach "> 1" (also zwei oder mehr) gefragt. Prozesse, die mit $ service übereinstimmen. – John1024

+0

Sie möchten es mit Bourne Shell ('sh') ausführen, aber Sie verwenden' ((....)) 'und' $ (....) ', die nicht in Bourne definiert sind. Natürlich, wenn auf Ihrem System sh mit bash verbunden ist, wird dieser Fehler nicht offensichtlich sein. – user1934428

Antwort

1

Ein Problem, diese Zeile ist:

$service=xxx 

Dies sollte wahrscheinlich sein:

service=xxx 

Auch die folgenden inhärent unzuverlässig:

(($(/bin/ps -ef | grep $service | wc -l) > 1)) 

Die Anzahl der Prozesse dieser gefunden Weg in einem Multitasking-System hängt von Unfällen des Timings ab. Eine zuverlässigere Methode ist pgrep zu verwenden:

pgrep "$service" 

Diese PIDs für $service ohne die Möglichkeit der Anpassung der grep Verfahren auflistet.

Da pgrep einen nützlichen Rückgabecode für sich selbst festlegt, ist kein Mathe-Test erforderlich. So ersetzen:

if (($(/bin/ps -ef | grep $service | wc -l) > 1)) 

mit:

if pgrep -q "$service" 

wo -qpgrep sagt nur den Exit-Code festlegen, ohne die PIDs Auflistung nach stdout.

Wenn Ihr pgrep nicht die -q Option nicht unterstützt, dann verwenden:

if pgrep "$service" >/dev/null 
+0

Danke! -q scheint nicht für mich arbeiten, kann ich einfach pgrep "service" verwenden? Ich benutze SH4.1 –

+0

@LeRay OK. Ich habe die Antwort mit dem, was zu tun ist aktualisiert, wenn Ihr 'pgrep' nicht' -q' unterstützt.(Irgendein mäßig aktuelles Linux sollte 'pgrep -q' unterstützen. Wenn Ihr Betriebssystem überhaupt kein' pgrep' hat, lassen Sie es mich wissen und wir können Alternativen besprechen.) – John1024

1

In der ersten Zeile des Skripts, verwendet Sie #/bin/sh statt #/bin/sh!. Wenn Sie ./process_check.sh verwenden, wird/bin/bash anstelle von/bin/sh verwendet.