lousek
Goto Top

Linux - Jede Minute ein Befehl in einem ShellScript ausführen

Hallo Forum.

Bin noch blanker Anfänger was Shell-Scripte in Linux angeht.

Also:
Ich will jede Minute ein SVN-Repository update (nicht comitten) (Befehl: svn update https://meinserver/meinrepopfad).

Nun habe ich keine Ahnung wie ich das Anstellen soll ...

der Script sollte .sh sein, oder?
Kann ich das Script selbst nur jede Minute aufrufen, oder muss das script die ganze Zeit rennen und z.B. in einer Schleife mit Sleep 59 (Sekunden) dies selbst tun?


Bin gespannt auf Vorschläge ;)

Greetz, Lousek

Content-Key: 104313

Url: https://administrator.de/contentid/104313

Printed on: April 23, 2024 at 08:04 o'clock

Member: 8schpi
8schpi Dec 17, 2008 at 15:40:42 (UTC)
Goto Top
zuerst ein script.sh basteln, welches die aufgabe erfüllt. z.b.:
#!/bin/sh
svn update https://meinserver/meinrepopfad
das also unter z.b. /home/ich/script.sh abspeicher und mit
chmod 755 /home/ich/script.sh
ausführbar machen.

jetzt sollte man den minütlichen aufruf meiner meinung nach über cron realisieren:
http://de.wikipedia.org/wiki/Cron
z.b.
* * * * * /home/ich/script.sh
Member: Alphavil
Alphavil Dec 17, 2008 at 16:01:07 (UTC)
Goto Top
Würde sagen eher so:

 */1 * * * * /home/ich/script.sh
Member: Lousek
Lousek Dec 17, 2008 at 16:15:32 (UTC)
Goto Top
Naja ... wo mus ich dies hinzufügen?

Greetz, Lousek

Edit: Habe so wie hier: http://www.selflinux.org/selflinux/html/cron01.html#d63e59 eine crontab-datei erstellt und den script eingetragen ... muss ich den daemon neustarten?

Edit2: Bei 1 * * * * * bringt er mir ein Fehler, bei * * * * * nicht .... ?
Member: datasearch
datasearch Dec 17, 2008 at 16:33:05 (UTC)
Goto Top
Du musst den crontab mit dem befehl crontab -e edieren. Um das Script jede Minute auszuführen, musst du die Zeile:

*/1 * * * * /pfad/zum/script.sh

eintragen. Dieser Eintrag hat folgende Bedeutung:

Pos1: Minute. (0-59)

Pos2: Stunde (0-23)

Pos3: Tag (1-31)

Pos4: Monat (1-12)

Pos5: Wochentag (mo-so, 0-7)

Pos6: Befehl

Du kannst auch in den Zeilen, wenn du zb. ALLE X Minuten, Tage oder Monate ein script ausführen möchtest, dies mit */X (Alle X Schritte) angeben. Im fall alle 5 Minuten währe das */5.

Schau aber bitte noch einmal in die Doku deines Cron-daemons. Mit "man crontab" sollten alle Informationen dazu erscheinen.
Member: Alphavil
Alphavil Dec 17, 2008 at 16:35:03 (UTC)
Goto Top
Sorry natürlich ist es so wie datasearch geschrieben hat (*/1 * * * */.....) richtig
Member: Lousek
Lousek Dec 17, 2008 at 19:57:33 (UTC)
Goto Top
Naja ... mal rabiat zum testen:
*/1 * * * * reboot

Oder muss ich zum reboot irgend ein pfad angeben? (Welchen:P)?

Greetz, Lousek
Member: Lousek
Lousek Dec 17, 2008 at 20:54:01 (UTC)
Goto Top
Hi again

Also */1 * * * * "reboot" geht ohne probleme (... musste ihn im single-user modus starten um das wieder rauszubekommen :P) ... doch mein script will er nicht ausführen

Wenn ich ihn so aufrufe: /home/reload.sh geht es.
So macht er nichts: */1 * * * * /home/reload.sh
Und verschoben nach /scripts mit chmod 777: */1 * * * * /scripts/reload.sh --> passiert auch nichts.

Auch wenn ich den Befehl direkt schreibe, was auf der konsole auch geht, klappt nichts: */1 * * * * "svn update /var/www"

Jemand ne Idee ;)

Greetz, Lousek
Member: 8schpi
8schpi Dec 17, 2008 at 21:27:44 (UTC)
Goto Top
das könnte daran liegen, dass die shell, die man per hand startet, die standard pfade für programme kennt. die instanz die durch cron gestartet wird kennt diese nicht. nach dem programm svn wird dann glaube nur im aktuellen verzeichnis gesucht und da ist es nicht.

das kann man durch einen befehl (ich weiß ihn jetzt nicht auswendig, linux ist schon wieder länger her, arbeite momentan mit windows) oder aber in diesem fall besser noch durch die angabe des kompletten pfads umgehen.
*/1 * * * * "/pfad/zum/svn update /var/www"  

dann müsste es gehen.
Member: datasearch
datasearch Dec 17, 2008 at 23:21:41 (UTC)
Goto Top
Oder du kannst im Script auch die pfade absolut angeben.

Beispielscript:

#!/bin/bash

#zuerst einige Variabeln mit den erforderlichen Pfaden und Parametern
SNVPATH=/usr/bin/svn
SYNCPATH=/var/www
PARAMETER=update
LOGFILE=/var/log/svnsync.log
TOUCH=/bin/touch

#Logfile vorhanden? Wenn nicht, anlegen.
if [ ! -f $LOGFILE ]; do $TOUCH $LOGFILE; fi

#nun testen ob der Pfad zur binary vorhanden ist und das SVN-Dir existiert
# dann folgen einige Fehlercode-auswertungen um bei Problemen etwas zu tun.
if [[ -e $SVNPATH && -d $SYNCPATH ]]; do
  $SVNPATH $PARAMETER $SYNCPATH >> $LOGFILE
  if [ $? == 0 ]; do
   echo SVN war erfolgreich >> $LOGFILE
  else
   echo SVN war nicht erfolgreich >> $LOGFILE
  fi 
 else
  echo $SVNPATH oder $SYNCPATH existiert nicht! >> $LOGFILE
fi

Das sollte auf jeden fall funktionieren. Selbst wenn du die Shell direkt vom kernel als init startest. Bitte noch einmal prüfen, habe jetzt keine Zeit das zu testen face-smile
Member: Lousek
Lousek Dec 18, 2008 at 08:13:20 (UTC)
Goto Top
Er bringt mir ein unexpected syntax-error bei:

if [ ! -f $LOGFILE ]; do $TOUCH $LOGFILE; fi

Greetz, Lousek
Member: Lousek
Lousek Dec 18, 2008 at 09:07:22 (UTC)
Goto Top
Hmm ... andere Frage:

Ich habe auf dem Debian dem root das anmelden verboten. Dafür habe ich einen User svnadmin.
Also mache ich mich mit sudo -s zum root ...
die crontab habe ich auch beim root editiert ... (also als ich root war habe ich crontab -e gemacht) ...
Kann es sein, das es irgendwas mit dem zu tun hat?

Werde das mal beim svnadmin reinschreiben ...

Was ich dann aber komisch finden würde, dass */1 * * * * "reboot" in der crontab vom root funktioniert hat ...

Greetz, Lousek
Member: datasearch
datasearch Dec 18, 2008 at 09:46:17 (UTC)
Goto Top
Sorry, mein Fehler. Habe die if-then mit der while-do Schleife verwechselt. ROFL. Ich habe das script eben getestet und nochmal etwas umgeschrieben. Solltest du so verwenden können.

#!/bin/bash

#zuerst einige Variabeln mit den erforderlichen Pfaden und Parametern
SVNPATH=/tmp/svn
SYNCPATH=/var/www
PARAMETER=update
LOGFILE=/var/log/svnsync.log
TOUCH=/bin/touch

#Logfile vorhanden? Wenn nicht, anlegen.
if [ ! -f $LOGFILE ]; then
  $TOUCH $LOGFILE
  echo neue Logfile erstellt >> $LOGFILE
fi

if [ ! -x $SVNPATH ]; then
 echo SVN wurde nicht unter $SVNPATH gefunden oder ist nicht ausfuehrbar >> $LOGFILE
 exit 101
fi

#nun testen ob der Pfad zur binary vorhanden ist und das SVN-Dir existiert
# dann folgen einige Fehlercode-auswertungen um bei Problemen etwas zu tun.
if [ -d $SYNCPATH ]; then
  $SVNPATH $PARAMETER $SYNCPATH >> $LOGFILE
  if [ $? == 0 ]; then
   echo SVN war erfolgreich >> $LOGFILE
  else
   echo SVN war nicht erfolgreich >> $LOGFILE
   exit 103
  fi
 else
  echo $SYNCPATH existiert nicht! >> $LOGFILE
  exit 102
fi


Bitte oben noch die Pfade richtig setzen.