Wie shell script alle 15min ausführen lassen?

Status
Für weitere Antworten geschlossen.

NangNang

Benutzer
Mitglied seit
08. Aug 2014
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Hi Leute,

ich bin ein Neuling im Bereich Shell/Crontab/Cronjobs, etc.

Also ich habe eine shell Datei, die meine IP Adresse zu einer website schicken soll, damit sie dort upgedated wird.

Das funktioniert auch, wenn ich mich per Telnet einlogge und sh .... ausführe.

Ich habe es per Aufgabenplaner versucht, aber es wird nicht ausgeführt. Was mich aber da auch stört ist, dass es nur stündlich funtkioniert.

Also wie kann ich am besten die Shell Datei von der Synology ausführen lassen, so dass es alle 15min oder 30min funktioniert?
Vielen Dank für die Hilfe!
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.772
Punkte für Reaktionen
3.742
Punkte
468
Ich weiss nicht, wie es mit dem Aufgabenplaner funktioniert, aber in der crontab schreibt man bei "Minute" einfach entweder "0,15,30,45" oder "*/15" hin, wenn etwas alle 15 Minuten ausgeführt werden soll.

Google einfach mal nach "crontab".
 

DI4bI0

Benutzer
Mitglied seit
08. Mrz 2011
Beiträge
264
Punkte für Reaktionen
14
Punkte
24
Unter /etc/crontab vollgendes einbfügen:

Rich (BBCode):
*/15    *    *    *    *    root    cd /path_to_your_script/ && ./DEIN_SCRIPT.sh

Anschließen noch den crond restarten mit:

Rich (BBCode):
/usr/syno/sbin/synoservicectl --restart crond

fertig mfg :)

Wichtiger Nachtag: Benutze bitte <tabs> als trenner und keine <leerzeichen>

Also:

Rich (BBCode):
*/15<tab>*<tab>*<tab>*<tab>*<tab>root<tab>cd<leerzeichen>/path_to_your_script/<leerzeichen>&&<leerzeichen>./DEIN_SCRIPT.sh
 
Zuletzt bearbeitet:

NangNang

Benutzer
Mitglied seit
08. Aug 2014
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
vielen dank für die Antwort.

Ich hab mir mal den Cronjob editor installiert, weil es scheint mir einfacher zu sein mit ihm das zu machen.

Ich hoffe dass es alles gut läuft unter DSM 5.0...

Jetzt in Bezug auf die Command bzw. den Pfad, muss der jetzt so aussehen:

1.) /volume1/sonstiges/meinscript.sh

oder

2.)

cd /path_to_your_script/ && ./DEIN_SCRIPT.sh

3.) kann ich nicht einfach auch, so machen:

sh /volume1/sonstiges/dein_Script.sh , als command ?

Eine weitere Frage wäre, muss ich der Datei bestimmte Rechte vorher zuweisen? Lese, Schreib etc.. Rechte und wenn ja, wie mache ich das am besten?



Siehe angehängtes Bild.

Grüße
 

Anhänge

  • Bildschirmfoto 2014-09-14 um 13.40.30.jpg
    Bildschirmfoto 2014-09-14 um 13.40.30.jpg
    37,9 KB · Aufrufe: 106
Zuletzt bearbeitet:

DI4bI0

Benutzer
Mitglied seit
08. Mrz 2011
Beiträge
264
Punkte für Reaktionen
14
Punkte
24
Ob 2.) oder 3.) is eigentlich egal kommt aufs selbe raus.
Bei 1.) bin ich mir jetzt nicht 100%ig sicher sollte aber auch funktionieren.

Zu den berechtigungen: Das Script sollte ausführbar sein also chmod +x dein_script.sh (console)

Wenn du nicht gerne über die console arbeitest, kannst du das auch über WinSCP realisieren.
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.772
Punkte für Reaktionen
3.742
Punkte
468
@NangNang
Normalerweise schreibt man sein Scripte so, dass es von beliebiger Stelle aus aufgerufen werden kann. Ist der Wechsel in ein bestimmtes Verzeichnis unbedingt erforderlich, kann man den Wechsel dorthin ja innerhalb des Scripts machen (cd ...). Dann macht man Script ausführbar ("chmod +x <script>" oder "chmod 755 <script>"), dann kann man es auch ohne "sh <script>" einfach ausführen. Ein "Shebang" wie "#!/bin/sh" in der ersten Zeile des Scripts hilft der startenden Shell, das Script mit der richtigen Shell bzw. Interpreter (z.B. perl) auszuführen. Soll das Script per crond ausgeführt werden, sollte man auch die notwendigen PATH-Einstellungen mit in das Script aufnehmen. /etc/profile und /root/.profile werden nämlich bei der Ausführung durch crond, im Gegensatz zur interaktiven Anmeldung, nicht durchlaufen.

Insofern ist meine Antwort auf deine Fragen: In der crontab sollte "/volume1/sonstiges/meinscript.sh" stehen.

Edit:
Unter /usr/syno/etc.defaults/rc.d (Linux-Startscripts) findest übrigens jede Menge Beispiele für Scripts. Schau dir die mal an.
 
Zuletzt bearbeitet:

NangNang

Benutzer
Mitglied seit
08. Aug 2014
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Danke dir Benares!
Der Code den ich benutze ist der folgende (abgespeichert als .sh Datei in /volume1/sonstiges/meinscript.sh):

Rich (BBCode):
#!/bin/sh                                                                                                                                                                                                   
#                                                                                                                                                                                                           
# Unblock-Us Update-Script  
#                                                                                                                                                                                
# This script automatically sends your current IP address to the Unblock-Us api.                                                                                                                             
# It can be used to update your IP adress via cron.                                                                                                                                                                                                                                                                                                                                            
# Variables (user specific)

userlogin="email@example.com"                                                                                                                                                                                   
userpassword="password"                                                                                                                                                                                    
 
# Environment                                                                                                                                                                                              
apiurl="https://api.unblock-us.com/login?$userlogin:$userpassword"                                                                                                                                          
wgetcmd=$(which wget)                                                                                                                                                                                       
 
# Check if username and password are set.                                                                                                                                                                   
if [ -z $userlogin ]                                                                                                                                                                                        
        then                                                                                                                                                                                                
                echo "No password set."                                                                                                                                                                     
                exit 1                                                                                                                                                                                      
elif [ -z $userpassword ]                                                                                                                                                                                   
        then                                                                                                                                                                                                
                echo "No password set."                                                                                                                                                                     
                exit 1                                                                                                                                                                                      
else                                                                                                                                                                                                        
        # Call the api                                                                                                                                                                                      
        response=$($wgetcmd --no-check-certificate -qO- $apiurl)                                                                                                                                            
 
        # Check response from api                                                                                                                                                                           
        if [ $response == "active" ]                                                                                                                                                                        
                then                                                                                                                                                                                        
                        echo "IP address is active. You are good to go!"                                                                                                                                     
                        exit 0                                                                                                                                                                              
        elif [ $response == "bad_password" ]                                                                                                                                                                
                then                                                                                                                                                                                        
                        echo "Wrong username or password."                                                                                                                                                  
                        exit 1                                                                                                                                                                              
        elif [ $response == "not_found" ]                                                                                                                                                                   
                then                                                                                                                                                                                        
                        echo "Username not found."                                                                                                                                                          
                        exit 1                                                                                                                                                                              
        else                                                                                                                                                                                                
                echo "Unknown error. Check api url or documentantion."                                                                                                                                      
                exit 1                                                                                                                                                                                      
        fi                                                                                                                                                                                                  
fi
Jetzt habe ich noch Sachen grade gelesen für bin bash etc... Muss ich da noch was befolgen oder reicht einfach die Ausführung wie oben von dir beschrieben?
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.772
Punkte für Reaktionen
3.742
Punkte
468
Ich seh da jetzt nichts, was den Einsatz einer erweiterten Shell wie der bash erforderlich machen würde. Von daher ist /bin/sh schon ok.

Behalt aber im Hinterkopf, dass solche Stellen wie z.B. "wgetcmd=$(which wget)" fest davon ausgehen, dass /usr/bin in PATH enthalten ist, sonst würde "which" nicht gefunden. Bei interaktivem Aufruf ist das immer der Fall, bei Ausführung als cron-Job aber nicht unbedingt. Deshalb besser "wgetcmd=$(/usr/bin/which wget)" schreiben oder halt "PATH=..." aus /etc/profile mit ins Script aufnehmen.

Bei "crontab-fähigen Scripts" sind also noch einige Besonderheiten zu beachten.

Edit:
Übrigens: Eine Textdatei wird nicht dadurch zum Script, dass der Name "meinscript.sh" ist, sondern durch die x-Rechte. Dein Script könnte daher durchaus auch nur "meinscript" heissen. Aber normalerweise nennt man Scripte schon .sh. Das ist anders als bei DOS/Windows (.bat, .cmd, .exe).
 
Zuletzt bearbeitet:

Eisblume

Benutzer
Mitglied seit
18. Nov 2011
Beiträge
56
Punkte für Reaktionen
0
Punkte
6
Hallo,

ich möchte ein Script täglich ausführen, was aber leider nicht funktioniert. Das Script wird scheinbar über cron nicht gestartet. Bei einem manuellen Start macht das Script das, was es soll.

Gibt es irgendwo ein Logfile der cronjobs?
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.675
Punkte für Reaktionen
2.077
Punkte
829
Poste doch das Skript einmal, dann finden wir vielleicht den Fehler.
 

Eisblume

Benutzer
Mitglied seit
18. Nov 2011
Beiträge
56
Punkte für Reaktionen
0
Punkte
6
Ich kann das anhand eines simplen Beispiels zeigen:

Code des Scripts (hier beispielhaft):
Code:
#!/bin/sh
# This script delete all empty folders
# The script will started with crontab

#----------------------------------
# config
#----------------------------------

folder_2_check="/volume2/downloads/"

#----------------------------------
# command for execute
#----------------------------------

# remove all empty folders
find $folder_2_check -type d -empty -delete

Ausführbar gemacht:
Code:
-rwxrwxrwx    1 root     root           392 Mar 19 09:47 deleteEmptyFolder.sh

Dann Eintrag in crontab:
Code:
10	10 	*	*	*	root	/volume2/@appstore/deleteEmpty/deleteEmptyFolder.sh

Hätte also um 10:10 ausgeführt werden müssen. Wurde es aber leider nicht. Wenn ich das Scrips manuell über die Konsole starte, macht es das, wass es soll.
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.675
Punkte für Reaktionen
2.077
Punkte
829
Versuche bitte einmal find im Skript mit komplettem Pfad zu versehen. Ich weiß aus dem Kopf nicht, ob /bin/find richtig ist, musst Du einmal prüfen.
 

Eisblume

Benutzer
Mitglied seit
18. Nov 2011
Beiträge
56
Punkte für Reaktionen
0
Punkte
6
Hab ich gemacht, liegt unter /usr/bin/. Ist aber auch nicht die Lösung. Das Script an sich funktioniert ja, wenn ich es über die Konsole starte. Es wird aber nicht über den cron gestartet (hab sowohl versucht, die cron über die Konsole zu editieren, als auch über den CronjobEditor auf der Syno). Beides ohne Erfolg.
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.675
Punkte für Reaktionen
2.077
Punkte
829
Es läuft in der Shell, weil dort ein .profile ausgeführt wird, das die PATH-Variable belegt. Dies ist bei einem cron-Skript nicht der Fall. Und deshalb ist das ein relevanter Unterschied. Du hast im Skript jetzt also /usr/bin/find stehen, richtig? Und es funktioniert trotzdem nicht, wenn es über den cron-Eintrag gestartet wird?
 

Eisblume

Benutzer
Mitglied seit
18. Nov 2011
Beiträge
56
Punkte für Reaktionen
0
Punkte
6
Ja, so ist es !! Es werden aber auch ganz einfache Scripte, wie z.B. date >>log.txt nicht ausgeführt, wenn ich sie über cron einplane.

Gibt es nicht irgendwo ein Logfile, wo cron seine Aktivitäten reinschreibt?
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.675
Punkte für Reaktionen
2.077
Punkte
829
Ich glaube nicht, aber ich kann heute Abend einmal schauen. Für date gilt wieder das schon ein paar Mal Geschriebene: Auch dieses Kommando musst Du in einem cron-Skript mit vollem Pfad aufrufen - also z.B. /bin/date, wenn ich diesmal richtig liege. Sonst kann es nicht laufen. Du kannst natürlich in dem Skript auch eine .profile sourcen oder die PATH Environmentvariable selbst definieren.
 

Eisblume

Benutzer
Mitglied seit
18. Nov 2011
Beiträge
56
Punkte für Reaktionen
0
Punkte
6
Will ja nicht nerven, aber hast Du Zeit gehabt, dass vielleicht mal bei Dir nachzubauen :confused:??
 

dil88

Benutzer
Contributor
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.675
Punkte für Reaktionen
2.077
Punkte
829
Danke für die Erinnerung. Ein cron-Logfile habe ich unter /var/log nicht gefunden.

Nachbauen kann ichs nicht, weil ich Deine aktuelle Version nicht habe. Auch Dein date-Beispiel kann nur funktionieren, wenn überall die Pfade angegeben werden. Beispiel:

Rich (BBCode):
#!/bin/sh

/bin/date >> /volume1/net/date.log

Das Ding funktioniert auch über cron, jede Wette. Du musst nur den roten String durch einen Deiner gemeinsamen Ordner ersetzen. Aber das hier

Rich (BBCode):
#!/bin/sh

/bin/date >> date.log

funktioniert ebenfalls, Du findest nur date.log nicht da, wo Du es vermutlich erwartest. Deshalb immer sowohl die binaries als auch die Zieldateien mit komplettem Pfad versehen, wenn man ein Skript per cron laufen lassen will.
 

Eisblume

Benutzer
Mitglied seit
18. Nov 2011
Beiträge
56
Punkte für Reaktionen
0
Punkte
6
Hi,

danke Dir ganz herzlich, es funktioniert jetzt endlich, wenn ich den Pfad mit angebe:

Code:
#!/bin/sh
# This script delete all empty folders
# The script will started with crontab

#----------------------------------
# config
#----------------------------------

folder_2_check="/volume2/downloads/"

#----------------------------------
# command for execute
#----------------------------------

# remove all empty folders
/opt/bin/find $folder_2_check -type d -empty -delete
 

Shigoru

Benutzer
Mitglied seit
04. Okt 2012
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Systemeinstellungen - Aufgabenplaner - Benutzerdefiniertes Script ausführen lassen
Das 4 mal anlegen 0,15,30,45 min
Ist viel einfacher als mit cron
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat