• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Test in If Klausel

Giftmischer

Seidenapfel
Registriert
30.03.07
Beiträge
1.338
Hallo Forum!

Ich habe eine Frage betreffend eines Testes in einer If Klauses in einem Script.
Gibt es einen Test um festzustellen ob ein bestimmtes Script im Hinterground (background) läuft?

Ich habe hier die Dateien:

- InfHello.sh

Dieses Script zeigt alle 5 Sekunden eine Nachricht wie lange das Script bereits läuft.

#!/bin/bash
infinite=0;
time=0;
while [ $infinite -eq 0 ] ; do
echo "Hello: the script is running for $time seconds."
let time=$time+5;
sleep 5;
done

- KillInfHello.sh

Dieses Script soll das oben gezeigte Script "killen" wenn es im Hintergrund läuft.

#!/bin/bash
Var=`ps| grep InfHello.sh | cut -d' ' -f3`
if [ Hier kommt der Test rein ]
echo "Killing InfHello.sh"
kill $Var
else
echo "There is no InfHello.sh"
fi


lg



Giftmischer
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Warum übernimmst Du beim Forken des Background Prozesses nicht die PID des Childes, bzw. schreibst ein .pid File?
Gruß Pepi
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Theoretisch könntest du auch

Code:
if ps| grep InfHello.sh; then
    echo "Killing InfHello.sh"
    killall InfHello.sh
else
    echo "There is no InfHello.sh"
fi
Denn wenn grep kein InfHello.sh findet, wird es >0 returnen, d.h. "ps| grep InfHello.sh"=false
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Sorry, so:

ps|grep nfHello.sh

sonst grepst du grep auch mit.
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Was natürlich nicht garantiert, daß ein infHello.sh und ein InfHello.sh ident sind, oder irgend ein anderer Prozess zufällig auch so heißt und deswegen auch gefunden wird. So kann man also maximal geziehlt raten und hoffen, daß es sich um den gewünschten Prozess handelt. Irgendwo muß der Prozess ja herkommen, daher sollte dieser Prozess auch die PID des Forks als .pid schreiben, oder das InfHello.sh selbst ein entsprechendes Tag anlegen.
Gruß Pepi
 

Giftmischer

Seidenapfel
Registriert
30.03.07
Beiträge
1.338
Danke an euch beide. Werde mir eure Vorschläge jetzt mal genauer ansehen :)
 

Steinchen

Finkenwerder Herbstprinz
Registriert
15.04.10
Beiträge
470
Hallo,

machs wie alle anderen auch, nutz Pidfiles:

Code:
#!/bin/bash

#Pfad zu deinem Pidfile
pidfile="/var/run/${0}.pid";

# Intervall zum Ausgeben des Wertes in Sekunden
outputinterval=5;

# Pfad zum Uptimefile
uptimefile="/tmp/${0}.uptime"

# Fehlerwerte:
# 1 - Programm läuft bereits
# 2 - Pidfile konnte nicht geschrieben werden
# 3 - Programm konnte nicht beendet werden.

uptime=0;

start {

    check_pid_file;
    write_pid_file;
    echo "Starte…"

    while ($foo); do

        echo "Hello: the script is running for $uptime seconds.";
        let uptime=$uptime+$interval;
        echo $uptime > "$uptimefile";
        sleep $interval;

    done 
}

stop {

    if [ -e "$pidfile" ]; then

        mypid=$(cat "$pidfile");

        if [ $(ps auxw | grep $mypid | grep -v grep | wc -l) -gt 0 ]; then

            echo "Stoppe $0 …";

            kill $mypid;

            if [ $? -ne 0 ]; then

                "Konnte Programm nicht beenden";
                exit 3;
            fi
        else

            echo "Es läuft kein Programm, allerdings wurde ein Pidfile gefunden. Dieses wird nun gelöscht."

            rm "$pidfile";
            
        fi

    else

        echo "Kein Pidfile für ein laufendes Programm gefunden…";

    fi
}

status {

    if [ -e "$pidfile" ];

        if [ ! -e "$uptimefile" ]; then

            "Echo konnte Uptimefile nicht finden…";
            exit 4;
        fi

        mypid=$(cat "$pidfile");


        if [ $(ps auxw | grep $mypid | grep -v grep | wc -l) -gt 0 ]; then

            echo "Programm läuft seit $(cat "${uptimefile}") Sekunden…"
        fi
    else

        echo "Kein Pidfile gefunden.";

    fi
}

# Funktion zum prüfen ob das Programm bereits läuft, bzw ein Pidfile übrig ist, das gelöscht werden kann
check_pid_file {

    if [ -e $pidfile ]; then

        oldpid=$(cat "$pidfile");

        if [ $(ps auxw | grep $oldpid | grep -v grep | wc -l) -gt 0 ]; then

            echo "Ein Programm läuft bereits, beende mich.";
            exit 1;
        else

            echo "Altes Pidfile vorhanden, lösche es".
            rm "$pidfile";
        fi
   fi
 
}

write_pid_file {

    echo "Erstelle Pidfile…";

    echo $$ > "$pidfile";

    if [ $? -ne 0 ]; then

        echo  "Konnte Pid-File nicht erstellen. Fehler.";
        exit 2;
    fi
}

switch "$1" in 

     "start")

    start
             ;;

     "stop")
            
    stop
            ;;

     "status")

    status
           ;;


     *)

        echo "Usage: $0 [start|stop|status]"
    ;;

esac
Hab bestimmt irgendwo nen Strichpunkt oder so vergessen weil ichs mir ohne Test aus den Fingern gesaugt habe.

Starten: script.sh start
Starten in den Hintergrund: script.sh start &
Stoppen script.sh stop
Status: script.sh status

Falls du Fragen hast, meld dich einfach.

cu
 
  • Like
Reaktionen: fyysh