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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 104313
Url: https://administrator.de/contentid/104313
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
12 Kommentare
Neuester Kommentar
zuerst ein script.sh basteln, welches die aufgabe erfüllt. z.b.:
das also unter z.b. /home/ich/script.sh abspeicher und mit
ausführbar machen.
jetzt sollte man den minütlichen aufruf meiner meinung nach über cron realisieren:
http://de.wikipedia.org/wiki/Cron
z.b.
#!/bin/sh
svn update https://meinserver/meinrepopfad
chmod 755 /home/ich/script.sh
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
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.
*/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.
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.
dann müsste es gehen.
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.
Oder du kannst im Script auch die pfade absolut angeben.
Beispielscript:
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
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
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.
Bitte oben noch die Pfade richtig setzen.
#!/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.