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.
 
Spröde

Spröde

Alter Sack
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
 
T

tgruene

Routinier
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.
 
HokusPokus

HokusPokus

Eroberer
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

Sucheingaben

unix beim starten skript mit starten

,

linux läuft skript

,

linux shell prüfen ob verzeichnisname mehrfach vorhanden ist

,
verhindern das ein bawhscript doppelt gestart2t qeeden kann
, php in shell skript ausführen, linux sh script nicht zweimal aufrufen lassen, cronjob nur starten wenn noch net läuft, bash script lock instanz, bash in neuer shell ausführen, bash funktion zweimal aufrufen, shell script nur einmal ausführen, unix pruefen ob prozess gestartet, website mehrfach aufrufen unix, linux shell script startet python und beendet sich, starten der shell windows skript, wenn script noch nicht gestartet dann starten linux, bashscript prüfen ob process schon vorhanden, bash ps prozess wird doppelt angezeigt
Oben