# [bash] Frage zu "pidof"

## 3PO

Hallo Zusammen,

ich will mir gerade einen "Watchdog" basteln, aber leider stehe ich gerade irgendwie auf dem Schlauch.

Hier mal das Script:

```
#!/bin/sh 

  

# Watchdog by 3PO

  

  

#check-frequency in seconds 

CHECKTIME=60 

LOG="/var/log/foo.log"  

DAEMOM=foo.x86

  

while sleep $CHECKTIME 

 do 

  PID="pidof $DAEMOM"

   if [ "$PID" = "" ] ; then  

    echo "$(date) Fehler, $DAEMOM laeuft nicht" >> $LOG

    echo "$(date) Starte $DAEMOM neu ..." >> $LOG

    /etc/init.d/ $DAEMOM restart

    PID="pidof $DAEMOM" && echo $PID

     if [ "$PID" = "" ] ; then

      echo "$(date) Fehler, $DAEMOM konnte nicht neu gestartet werden" >> $LOG

     else     

      echo "$(date) $DAEMOM wurde neu gestartet" >> $LOG   

     fi

   fi

 done

exit
```

Das mit $PID, bzw. pidof funktioniert nicht. 

Wie kann ich das lösen, bzw anders machen?

----------

## Evildad

Glaub ganz einfach:

falsch

```

  PID="pidof $DAEMOM" 

  if [ "$PID" = "" ] ; then  

```

richtig

```

  PID=`pidof $DAEMOM`

  if [ -z "$PID" ] ; then

  

```

----------

## 3PO

Nein das funktioniert leider auch nicht.  :Sad: 

BTW: Ist denn " und ' nicht das selbe?

----------

## Evildad

` (neben dem Fragezeichen) und nicht ' oder "

Ich habs grad getestet und es sollte das machen was Du willst.

----------

## 3PO

```
PID=`pidof $DAEMOM` 

  if [ -z "$PID" ] ; then 
```

ich bäuchte des invertiert, aber 

```
PID=`pidof $DAEMOM` 

  if [ ! -z "$PID" ] ; then 
```

gehht leider nicht.  :Sad: 

----------

## Evildad

```

 -n STRING the length of STRING is nonzero
```

Aber im ersten Fall macht das doch gar keinen Sinn, oder?

```

DAEMOM=/usr/sbin/acpid

PID=`pidof $DAEMOM`

       if [ -z "$PID" ] ; then 

           echo "$(date) Fehler, $DAEMOM laeuft nicht"

         else 

         echo "tut"

   fi

```

Wenn der ACPID Daemon läuft kommt die Ausgabe tut, falls nicht kommt deine Ausgabe mit laeuft nicht...

----------

## 69719

Probier es mal mit

```

#!/bin/sh

 

# Watchdog by 3PO

 

 

#check-frequency in seconds

CHECKTIME=60

LOG="/var/log/foo.log" 

DAEMOM=foo.x86

 

while sleep $CHECKTIME

 do

  PID=$(pidof $DAEMOM)

   if [ -z "$PID" ] ; then 

    echo "$(date) Fehler, $DAEMOM laeuft nicht" >> $LOG

    echo "$(date) Starte $DAEMOM neu ..." >> $LOG

    /etc/init.d/$DAEMOM restart

    PID=$(pidof $DAEMOM)

     if [ -z "$PID" ] ; then

      echo "$(date) Fehler, $DAEMOM konnte nicht neu gestartet werden" >> $LOG

     else    

      echo "$(date) $DAEMOM wurde neu gestartet" >> $LOG   

     fi

   fi

 done

exit

```

Ich lass meine Dienste mittels

```

#!/bin/bash

function check_runlevel {

        for SERVICE in $(ls /etc/runlevels/$1); do

                /etc/runlevels/"$1"/"$SERVICE" status || /etc/runlevels/"$1"/"$SERVICE" start

        done

}

check_runlevel boot

check_runlevel default

```

und eine cronjob Eintrag überprüfen.

----------

## 3PO

Mit PID=`pidof $DAEMOM` gehts.  

1000 thx @ Evildad

----------

## Evildad

Kein Problem   :Very Happy: 

@esocr: Ich überwache meine wichtigen Dienste mit Nagios.

----------

## 69719

 *Evildad wrote:*   

> Kein Problem  
> 
> @esocr: Ich überwache meine wichtigen Dienste mit Nagios.

 

Ich auch, aber nur auf Arbeit  :Smile: , zuhause reicht so nen kleines Script, welches mir die weggeflogenen Dienste neu startet.

----------

## 3PO

Ich hätte da noch eine Frage:

Wie kann ich den prüfen ob ein Script gerade ausgeführt wird?

pidof foo.sh  gibt leider keinen Wert zurück, obwohl foo.sh gerade ausgeführt wird.

----------

## Evildad

```

FOO=`ps  aux |grep foo |grep  -v grep`

if [ -z "$FOO" ]

   then

   # Just do it

   foo

else   

   # Do nothing

   exit 1

fi

```

Sowas?

€dit: Wobei glaube ich auch pidof -x funktionieren  könnte...

----------

## 3PO

Thx @ Evildad.

Funktioniert beides.  :Smile: 

----------

## Evildad

 *3PO wrote:*   

> Thx @ Evildad.
> 
> Funktioniert beides. 

 

Wunderbar, freut mich   :Very Happy: 

----------

## 3PO

BTW.....

man Pages lesen bildet.   :Laughing: 

man pidof

 *Quote:*   

> .....
> 
>  -x     Scripts too - this causes the program to also return process id's of shells running the named scripts.
> 
> .....

 

Da hätte ich auch selber drauf kommen können.   :Embarassed:   :Rolling Eyes: 

----------

## Evildad

 *3PO wrote:*   

> BTW.....
> 
> man Pages lesen bildet.  
> 
> 

 

Daraus hab ichs ja  :Smile: 

Wollte aber nicht einen auf RTFM machen.

----------

## Knieper

http://www.math.ntnu.no/mirror/www.qmail.org/koobera/www/daemontools/supervise.html

----------

## toralf

Das leidige back-quote - Mißverständnis (` versus ') läßt sich auf der Shellebene umgehen durch Verwendung von $(...), also z.B. 

```
tfoerste@n22 ~ $ D=`date`; echo D=$D; U=$(date -u); echo U=$U

D=Thu Sep 17 10:29:58 CEST 2009

U=Thu Sep 17 08:29:58 UTC 2009

```

Anbei, was heißt eigentlich DAEMOM ? Ich kenne nur DAEMON.

----------

