Zwei Skripte sollen nicht zeitgleich laufen

D

drm

Eroberer
Hallo zusammen,

ich habe zwei Skripte: script1.ksh und script2.ksh

Diese beiden Skripte sollen nicht zeitgleich laufen. Beide Skripte sollten das jeweils gegenseitig prüfen. Wie kann ich das am besten realisieren?

Ich habe schon überlegt das irgendwie mit ps zu machen, weiß aber nicht genau wie ich prüfen soll. Kann mir dabei jemand helfen? Ich nutze übrigens die ksh!
 
Du koenntest eine Art lock-Datei erzeugen, zum Beispiel in /tmp
Am Anfang beider Skripte wird getestet, ob diese Datei vorhanden ist. Falls ja, endet das Skript, falls nein, wird die Datei angelegt (mit touch dateiname) und der Rest des Skriptes ausgefuehrt. Am Ende dieses Blockes muss die Datei dann wieder geloescht werden.
 
@rikola: Ja, das wäre eine Möglichkeit an die ich noch gar nicht gedacht habe. Hört sich nicht schlecht an.

Ist das wirklich die "schönste" Lösung, oder hat jemand noch eine weitere Alternative. Wie wäre es wenn man mit ps - u "user" schaut was gerade ausgeführt wird und darauf prüft? Was ist vom Stil besser?
 
oder machst ein exit 0 bis exit 9 und lässt den rückgabewert dieses skripts vom jeweils anderen skript auslesen um zu wissen wie weiter zu verfahren ist.
 
Eigentlich ist keines der beiden schön, weil beide eine Race-Condition hervorrufen können. Die sauberere Idee ist jedoch die mit dem lock-File, welche am besten noch die Prozess-ID des anderen Prozesses beinhaltet. So kannst du auch prüfen, ob das andere Program nicht gecrasht ist (sprich PID nicht mehr im System bekannt).

Wirklich sauber liesse sich das mit Semaphoren programmieren, jedoch weiss ich nicht, obs das für die Shell gibt (perl supported das meines Wissens).
 
Ist das wirklich die "schönste" Lösung, oder hat jemand noch eine weitere Alternative. Wie wäre es wenn man mit ps - u "user" schaut was gerade ausgeführt wird und darauf prüft? Was ist vom Stil besser?

Ist es vielleicht auch moeglich, beide Skripte zu einem zusammenzufassen und innerhalb des einen Skriptes die Bedingungen zu pruefen, welcher Teil denn laufen soll? Haengt natuerlich von Sinn und Zweck der beiden Skripte ab.
 
@rikola: So, oder ein Wrapperscript, welches die Scripte aufruft wäre natürlich auch eine schöne Lösung.
 
mit ps würde es ja auch gehen

wenn das script läuft dann kommt 2 zurück und wenn es nicht läuft 1
ps user | grep -c "scriptname"
 
Also sowas mach mich generell via "pidfile". allerdings lege ich die nicht in /tmp an weil /tmp automatisch geleert wird.
Meistens benutz ich dafür ein unterordner bzw ein dot.ordner.
Beispiel mein Backupscript legt am anfang eine Datei Namens "/home/manuel/.backups/backup.pid" an in der Datei auch die PID steht.

Somit kann ich a) in auch in anderen Script prüfen ob gerade ein ein Backup gemacht wird, ist also das was du willst.
und b) sehe ich auch wenn die datei nicht gelöscht wird das was nicht ganz ok sein kann.

im prinzip machst du am anfang deines script einfach ein "touch /path/file" und am ende "rm /path/file"

in allen anderen scripten kannst dann sowas wie
Code:
if [ -f "/path/file" ]; do echo "rennt..." ;done
 
Also sowas mach mich generell via "pidfile". allerdings lege ich die nicht in /tmp an weil /tmp automatisch geleert wird.
Meistens benutz ich dafür ein unterordner bzw ein dot.ordner.
Beispiel mein Backupscript legt am anfang eine Datei Namens "/home/manuel/.backups/backup.pid" an in der Datei auch die PID steht.

Somit kann ich a) in auch in anderen Script prüfen ob gerade ein ein Backup gemacht wird, ist also das was du willst.
und b) sehe ich auch wenn die datei nicht gelöscht wird das was nicht ganz ok sein kann.

im prinzip machst du am anfang deines script einfach ein "touch /path/file" und am ende "rm /path/file"

in allen anderen scripten kannst dann sowas wie
Code:
if [ -f "/path/file" ]; do echo "rennt..." ;done
/tmp wird üblicherweise nach einem Reboot geleert -> dann ist auch das Programm weg. Also eigentlich gar nicht so ungeeignet?

Der wohl korrekte Pfad für ein PID-File ist, wenigstens unter Solaris, /var/run wenn ichs korrekt im Kopf habe.
 
Naja, aber ich möchte eventuell nicht das die Pid nach einem reboot weg ist.
Da ich so auch noch nach 2-3 reboots/oder spätestens nach den nächsten start des Programms feststellen kann ob das Programm vorgestern oder wann auch immer ordentlich beendet hat.

/var/run ist richtig ja. Ich ich halte mich da in der Regel selten dran.
meine Pid files liegen meistens im gleichen ordner wie programm oder in ~/.$programm
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

Shell-Skript nicht doppelt starten

Skript, um Seiten eines Dokuments zu drucken

awk/sed Zeilen bei der Uhrzeit 3 Minuten auseinanderliegt löschen

Per FTP im Skript zu bestimmtem FTP-Account

Zurück
Oben