Script automatisch starten

D

drm

Eroberer
Hallo!
Ich brauche mal eure Hilfe :hilfe2:
Ich habe ein Script, dass alle 2 Stunden automatisch startet. Jetzt möchte ich dass daraus jede Woche am Montag um 20:00 Uhr ein Script monday_update im Hintergrund gestartet wird. Sollte das Script monday_update schon gestartet sein, darf es nicht erneut gestartet werden.

Habt ihr eine Idee wie ich das angehen kann?
 
Das Script, welches schon alle 2 Std. ausgeführt wird läuft schon mit einem Cron-Job. Jetzt soll in dem Script geschaut werden (per Datumsprüfung) ob Montag 20 Uhr ist und ein anderes Script gestartet werden.

Wie kann ich aus einem Script sagen, es soll ein anderes Script gestartet werden, und vorher prüfen ob dieses Script schon läuft, da wenn es schon läuft das Script kein zweites mal ausgeführt werden soll. Die Prüfung des Datums krieg ich wohl alleine hin, brauche aber für das Aufrufen und überprüfen des Scripts hilfe.

Schon mal danke im Voraus!
 
Hallo

Wo liegt das Problem?
Du startest ein Script genauso, wie aus der Shell auch. Lediglich den vollen Pfad solltest du mit angeben, da u.U. die Umgebungsvariablen der Shell nicht userspezifisch verfügbar sind.
Ob ein Programm läuft sagt dir eine Kombination aus ps und grep.
if [ "$(ps a|grep ash)" ];
then
echo "bash is runnig";
else echo "not running, start script";
/usr/bin/script;
fi



Gruß Wolfgang
 
Das macht Sinn, ps gibt den Status jedes im Moment im System laufenden Prozesses wieder und grep wird verwendet um nach Textmustern in Dateien zu suchen. Wofür steht denn dann in der if-Abfrage noch das a| ?

Mein Script läuft auch jetzt soweit, allerdings gibt er mir noch zusätzlich
usage: ps...
'format' is one or more of:...
aus? Warum?

@Wolfgang: Danke für die Idee mit dem ps grep!
 
Zuletzt bearbeitet:
Hallo

Das a ist eine Option zu ps und der | ist eine Pipe, um das Ergebnis an grep zu verfüttern, welches wiederum nach dem Scriptname sucht.
Bei Erfolg von grep liefert das ganze Konstrukt true zurück.

Gib einfach mal ps a in deiner Shell ein.
Welche Optionen dein ps versteht, kannst du rausbekommen wenn du die Manpage liest. ;)

Gruß Wolfgang
 
So sieht mein Code bisher aus:
Code:
wochentag="Montag"
akt_wochentag="$(date +%A)"
stunde=20
minute=00
akt_stunde="$(date +%H)"
akt_minute="$(date +%M)"

if [ $akt_wochentag == $wochentag ] && [ $akt_stunde$aktminute == $stunde$minute ] ;
  then
    if [ "$(ps a|grep update_monday)" ] ;
      then
        echo "update_monday wird bereits ausgeführt";
      else
        echo "update_monday wird gestartet"
        update_monday;
    fi
else
    echo "Ausführung von monday_update nur um "$stunde":"$minute" Uhr!";
fi
Problem: Die Ausführung klappt nicht, selbst wenn es 20:00 Uhr ist erhalte ich die Meldung "Ausführung von monday_update nur um 20:00 Uhr!". Da der Cronjob nur alle zwei Stunden läuft ist doch sicherlich auch das Problem, dass ich nie sicher sein kann dass ich um 20 Uhr das Script ausführe. Hat jemand eine Idee?
 
Hallo

Du machst es dir sehr kompliziert.
Dafür, dass ein Skript zu einem bestimmten Zeitpunkt läuft, ist definitiv die crontab da.
Wenn du nun verhindern willst dass davon noch eine Instanz läuft, schreib einfach am Beginn des Skriptes selbst die Prüfung rein, und beende wenn es läuft.
Damit sparst du dir den ganzen Trouble.
Zeitnahes Prüfen auf Gleichheit ist immer ein Risiko in diesem Fall.
Wenn du wirklich damit arbeiten willst (siehe meine vorige Bemerkung) dann musst du mit dem Timestamp arbeiten und auf >= prüfen.

GNU/date kennt date +%s
Damit kannst du dann sogar rechnen.

Gruß Wolfgang
 
Wenn du nun verhindern willst dass davon noch eine Instanz läuft, schreib einfach am Beginn des Skriptes selbst die Prüfung rein, und beende wenn es läuft.
Ja, ich möchte verhindern, dass davon noch eine Instanz läuft...
Ich habe auch irgendwie das Gefühl, dass das umständlich ist was ich gerade mache, allerdings verstehe ich deinen Vorschlag nicht ganz. Welche Prüfung meinst du zu Beginn?
Bei meiner Lösung (siehe oben) fehlte übrigens nur noch der Unterstrich (_) bei $aktminute, jetzt funktioniert mein Script, allerdings nur wenn es genau während der Zeit - hier 20:00 Uhr - ausgeführt wird. Das einzige Problem hierbei ist noch, dass ich nicht nur sagen möchte, er soll es Punkt 20:00 Uhr ausführen, sondern er soll es zwischen 19:45 - 20:15 Uhr ausführen, weil nur dann sichergestellt ist dass der andere Cronjob während dieser Zeit auf das Script zugreift!!!
Wie kann man das am Besten in der if-Abfrage machen, oder geht es dort gar nicht?
Code:
if [ $akt_wochentag == $wochentag ] && [ $akt_stunde$aktminute == $stunde$minute ] ;
Würde mich sehr freuen wenn mir jemand weiterhelfen könnte :-)
 
Zuletzt bearbeitet:
Mach es sauber: Bau das Skript so um, dass das Skript ausschließlich die Funktion beinhaltet. Die Zeitsteuerung (wann bzw. in welchem Zeitraum das Skript läuft) regelst du mit der Crontab bzw. als CronJob - denn dafür ist der Cron-Daemon genau da!
 
allo
Also schreib dir ein Startskipt, welches dein Skript aufruft, und trage das in deine crontab ein.
Trag es so ein, dass es jeden Montag um 20:00 Uhr startet.
0 20 * * 1 /path7to/startscript/skriptname_start
In das schreibst du einfach die Abfrage rein, ob dein Skript schon läuft und startest dieses dann, oder beendest das Startskript ohne Aktion.

Wenn das script als Crotjob läuft müsstest du allerdings die vollen Pfade angeben und bei ps auch nicht tty -basierte Programme ausgeben.
Könnte also so ähnlich aussehen:
Code:
if [ "$(ps ax |grep "[S]criptname")" ];
then
echo "Script läuft schon";
exit;
else
/path/to/script/Script;
fi

Muss natürlich mit Shebang und ausführbar sein.

cron übernimmt dann alles für dich, und du brauchst keine eigenen Hacks mit der Zeit einbauen.

Du solltest immer bedenken, dass auch ein Cronjob mal verzögert starten kann, so dass ein direkter Vergleich daneben gehen kann.

Gruß Wolfgang
 
Zuletzt bearbeitet:
Hab's jetzt mit crontab gemacht, die Prüfung ob's schon aktiv ist funktioniert auch, vielen lieben Dank für eure Hilfe und Unterstützung!!!
 

Ähnliche Themen

systemd service mit Bash Script und Subshell in einer tmux Umgebung

Script pausieren bis Bedingung erfüllt ist

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

Keine grafische Oberfläche (Debian Installation)

Service oder Screen überwachen und ggf. Neustarten?!

Zurück
Oben