Shell-Skript nicht doppelt starten

HokusPokus

HokusPokus

Eroberer
Hallo zusammen.

Ich habe hier ein Problem mit meinem Shell-Skript, das ist seit Tagen zu lösen versuche. X( Bisher leider erfolglos.

Ziel: Das Skript wird per cron alle zwei Stunden gestartet und soll jedes Mal prüfen, ob es vom letzten Mal noch läuft. Wenn ja: kein weiterer Start. Wenn nein: erneut starten.

Code:
#!/bin/bash
ps -e | grep Backups | grep -v grep > /dev/null
if [ $? -ne 0 ]
then

  /home/user/Backup_1
  /home/user/Backup_2
  /home/user/Backup_3
  /home/user/Backup_4

else
  echo "Vorheriger Prozess läuft noch - keine Backups - Exit"
fi

Das Problem: Wenn ich den Befehl
Code:
ps -e | grep Backups | grep -v grep > /dev/null
in der Konsole eingebe und danach $? abfrage, kommt 1 als Ergebnis zurück. Somit sollte das Skript starten - tut es aber nicht...

Weiß einer von euch Rat?

Das Skript hat auch schon so ausgesehen:

Code:
#!/bin/bash
ps -e | grep Backups | grep -v grep | awk '{ print $1 }' > /dev/null
if [ $? -ne 0 ]
then

  /home/user/Backup_1
  /home/user/Backup_2
  /home/user/Backup_3
  /home/user/Backup_4

else
  echo "Vorheriger Prozess läuft noch - keine Backups - Exit"
fi

Bringt leider auch nichts. Hier erscheint dann immer der Fehlercode 0. Egal ob das Skript läuft oder nicht.

Grüße.
 
Code:
#!/bin/bash

Lockfile=/tmp/Backup_Lock

if [ -f $Lockfile ]
then
  echo "Vorheriger Prozess läuft noch - keine Backups - Exit"
  exit
fi

echo >$Lockfile

/home/user/Backup_1
/home/user/Backup_2
/home/user/Backup_3
/home/user/Backup_4

rm $Lockfile

http://de.wikipedia.org/wiki/Lock
 
Wenn Du innerhalb des Skriptes den ps-Befehl ausfuehrt, findet es ja zumindest sich selbst, egal ob eine weitere Instanz davon laeuft oder nicht. Deswegen funktioniert Dein Ansatz nicht.
Der richtige Weg ist die lock-Datei von Sproede. Idealerweise enthaelt diese die PID des Skriptes, das sie erzeugt hat. Dann kannst Du im Skript ueberpruefen, ob neben der Datei auch der eigentliche Prozess laeuft. Wenn nicht, wurde das Skript nicht ordentlich beendet, so dass ein neuer Anlauf starten kann, der dann auch die Datei neu anlegt.
 
Vielen Dank erstmal. Ich habe das mal ins Skript übertragen und werde es dann mal ausprobieren, habe an der Vorgehensweise von euch keine Zweifel.
Manchmal ist die Lösung zu einfach...
Leider mache ich noch viel zu wenig in der Shell, als dass ich mich gut auskennen könnte. Da muss ich noch viel dazulernen.

Der Ansatz von tgruene interessiert mich auch noch. Auch dem werde ich noch nachgehen. Es muss also nach der Überprüfung, ob die Datei vorhanden ist, noch geprüft werden, ob es die PID, die in der Datei steht, noch gibt. Wenn ja, läuft der Prozess noch - Abbruch. Wenn nein, wurde das Skript unsauber beendet und die Datei muss gelöscht werden. Dann läuft das Backup-Skript auch an.

Quasi: Lock-Datei vorhanden + PID existent = Abbruch
Lock-Datei vorhanden aber PID nicht existent = Lock-Datei löschen, neu erstellen und Backup-Skript starten
Lock-Datei nicht vorhanden = Lock-Datei erstellen und Backup-Skript starten
 

Ähnliche Themen

Switche abfragen über Script

Skript soll nicht doppelt laufen... kill pkill pid cron

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

Zurück
Oben