Hi,
Ich suche eine Möglichkeit zu verhindern, daß ein Script 2x aufgerufen wird.
Es soll, einmal gestartet, bei einem Wiederaufruf ausgeben: 'Script läuft bereits, cancel'
Einfacher Weg:
Das Script legt beim Erstaufruf eine Datei (oder einen Eintrag in einer solchen) an, und schaut jedesmal nach, ob diese bereits exisiert oder nicht.
Beim Stoppen löscht es diesen wieder... und der Weg zu einem Neuaufruf ist frei.
Nachteil: Wird das Script mal nicht sauber beendet, bleibt die Datei bestehen und muss händisch entfernt werden.
Besser:
Mit 'ps aux | grep script' wird kontrolliert, ob ein Prozess mit unserem Scriptnamen schon läuft.
Wenn ja, wird abgebrochen.
Das ist aber garnicht so einfach, weil ein Prozess mehrere Einträge erzeugen kann und diese auch nicht unbedingt gleich wieder verschwinden.
Mal abgesehen davon, daß unser zweiter Aufrufsversuch natürlich auch Einträge erzeugt.
Wie dem auch sei, ich habe schon verschiedene Versuche hinter mir, aber nichts funktioniert wirklich 100%.
zB folgender:
Tja, tut es eben nicht...
Gibt's nicht einen besseren Weg??
Ich suche eine Möglichkeit zu verhindern, daß ein Script 2x aufgerufen wird.
Es soll, einmal gestartet, bei einem Wiederaufruf ausgeben: 'Script läuft bereits, cancel'
Einfacher Weg:
Das Script legt beim Erstaufruf eine Datei (oder einen Eintrag in einer solchen) an, und schaut jedesmal nach, ob diese bereits exisiert oder nicht.
Beim Stoppen löscht es diesen wieder... und der Weg zu einem Neuaufruf ist frei.
Nachteil: Wird das Script mal nicht sauber beendet, bleibt die Datei bestehen und muss händisch entfernt werden.
Besser:
Mit 'ps aux | grep script' wird kontrolliert, ob ein Prozess mit unserem Scriptnamen schon läuft.
Wenn ja, wird abgebrochen.
Das ist aber garnicht so einfach, weil ein Prozess mehrere Einträge erzeugen kann und diese auch nicht unbedingt gleich wieder verschwinden.
Mal abgesehen davon, daß unser zweiter Aufrufsversuch natürlich auch Einträge erzeugt.
Wie dem auch sei, ich habe schon verschiedene Versuche hinter mir, aber nichts funktioniert wirklich 100%.
zB folgender:
Code:
#!/bin/sh
# STOP
# Stopscript zum einbinden, verhindert Wiederaufruf.
#
# Der Dateiname des aufrufenden Script "$0":
NAME=`echo $0 | sed 's|^.*/||g'`
PID=` \
# alle Prozesse:
\
ps aux |\
\
# auf den Namen:
\
egrep "$0" |\
\
# im Vordergrund:
\
grep '+' |\
\
# nur die pid:
\
awk '{print $2}' |\
\
# ohne den aufrufenden Prozess:
\
sed "s|$$||g"`
# jetzt sollten genau eine Pid für jeden laufenden Prozess in "$PID" sein.
# frag am besten nicht weiter... ;-)
#
# Auf jeden Fall ist die Zahl der laufenden Prozesse unter dem Namen nicht klar.
# Darum:
n=0
for i in $PID ; do n=$(( $n+1 )) ; done
if [ $n -gt 1 ] ; then
echo $0' läuft bereits, exit'
exit 0
fi
# Es ist nicht der erste Versuch, dieses Script zuverlässig zu machen...
# vielleicht klappt es ja diesmal.
Tja, tut es eben nicht...
Gibt's nicht einen besseren Weg??