Wie kann ich einen bestimmtes Kommando alle X Minuten ausführen unter Linux?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Wo ist bei Crontab denn das Problem?

Einfach crontab -e eingeben, dort eine entsprechende Befehlszeile eingefügt und los:

*/30 * * * * sudo python /home/pi/speed/speedtester.py

Das sudo ist optional, sofern das Script mit Root-Rechten laufen muss musst du das auch angeben.

Ausgaben findest du indem du mail eingibst, da Cron entsprechende Rückmeldungen dorthin weiterleitet. Ansonsten einfach mit > Datei arbeiten:

*/30 * * * * sudo python /home/pi/speed/speedtester.py > /home/pi/speedtest.log
Tuxgamer2  18.07.2017, 16:55

Wieso das sudo?

1
SYSCrashTV  18.07.2017, 16:56
@Tuxgamer2

Das sudo ist optional, sofern das Script mit Root-Rechten laufen muss musst du das auch angeben.

Lesen muss man können.

1
SYSCrashTV  18.07.2017, 17:03
@Tuxgamer2

Das geht so oder so. Ob nun der Cron-Prozess als Root läuft oder das ausgeführte Skript ist dabei egal, in beiden Fällen läuft es als Root.

0
Tuxgamer2  18.07.2017, 17:08
@SYSCrashTV

Falsch.

Dein Crontab mit sudo läuft nur, wenn du dein System sicherheitstechnisch verkrüppelt hast - und sudo ohne Passwort erlaubst.

Und das ist wirklich keine gute Idee...

2
Benniwartmann 
Fragesteller
 18.07.2017, 17:54

das "30" sind 30 Minuten oder?

0
kernash  18.07.2017, 17:55

crontab kennt eventuell den Pfad von python nicht, da es ja keine Shell öffnet und keine Umgebungsvariabeln hat.

0
Tuxgamer2  18.07.2017, 18:04
@kernash

@kernash

Hab ich auch schon überlegt. Aber cron doch normalerweise Path auf /bin:/usr/bin - was python auf /usr/bin/python finden sollte.

Wobei ich cron immer mit absoluten Pfaden arbeite...

0
Benniwartmann 
Fragesteller
 18.07.2017, 18:15

Ich hab aus der "/30" jetzt "/2" gemacht. Und es passiert nach 2 Minuten nichts.

0
guenterhalt  18.07.2017, 19:46

Das sudo ist optional, sofern das Script mit Root-Rechten laufen muss musst du das auch angeben.

das sind wieder mal die Auswirkungen dieser scheiz Idee von Ubuntu:

Jeder benutzt es, ohne zu überlegen. (natürlich nur die, die es nicht verstehen)

Hier habe ich auch schon mal gelesen, man solle einen Crontab verwenden.  Und wieder, es wird ohne Überlegung übernommen.

Die Datei crontab ist die Steuerdatei für cron. Cron wird als Dämon gestartet und dieser Prozess läuft mit der User-ID 0 ,das heißt unter der Regie von root.

Damit ist sudo völlig überflüssig, denn das bedeutet

"benutze UID = 0 statt UID = 0 " widersinnig oder nicht?

Hinzu kommt, dass die Datei /etc/sudoers wahrscheinlich auch für root einen  Eintrag

root ALL=(ALL) ALL

haben muss.

Einfach sudo weglassen und das selbst gemachte Problem ist beseitigt.

0
Silberfan  19.07.2017, 03:56
@guenterhalt

Kleine Anmerkung am Rande

Wir im Linux Bereich Unterscheiden zwischen Cron Tab und Cron Job. Der Cron Job kann von einem Benutzer im eigenen Verzeichnis entsprechend Konfiguriert und eingesetzt werden wobei der Cron Tab vom root ( Admin)  eingesetzt werden kann. wenn man also ein Script mit root rechten starten will eignet sich dies im Cron Tab . Benötigt das Script keine root rechte reicht es aus den Cron Job als Benutzer auszuführen.

https://wiki.ubuntuusers.de/Cron/

Somit unterscheidet man auch  die Cron funtionen Systemweit oder Benutzer weit. Für die root sache findet man meist die Informationen dazu in /etc/crontab ( je nach Linux Distribution) .Daher bitte ich Höflich strikt zu trennen zwischen Cron Job ( Benutzer) und Cron Tab ( root) . Hält man sich daran kann eigentlich nichts schief gehen.

Manchmal hilft auch sowas :

Wenn ein Skript in der Konsole funktioniert, nicht aber wenn es über  die systemweite Cron-Tabelle gestartet wird, kann das daran liegen, dass sich das Startverhalten einer Shell über eine Cron-Tabelle von dem  einer Loginshell unterscheidet. In diesem Fall sollte man das Skript  anpassen oder folgenden Befehl in die Cron-Tabelle eintragen:

/bin/bash --login /PFAD/ZUM/SKRIPT.sh



0

Hallo

Ich möchte alle 30 Minuten automatisch den Befehl "python /home/pi/speed/speedtester.py"

Die einfachste Lösung ist watch zu benutzen, die Syntax sieht so aus:

watch -n1800 "python /home/pi/speed/speedtester.py" &

Das führt das Kommando, das innerhalb der Gänsefüßchen steht, alle 1800 Sekunden (= 30 Minuten) und im Hintergrund aus.

Ich hab es mit Crontab probiert und es geht nicht. 

Dann hast Du da was falsch gemacht, denn auch mit einem Cronjob lässt sich das machen, eleganter aber mit mehr  Aufwand.

Man kann natürlich auch noch screen verwenden um den Prozess im Hintergrund ablaufen zu lassen

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

Wie bereits probiert mit crontab (da hast du wohl was falsch gemacht.. crontab ist eigentlich zuverlässig) oder per watch (wobei ich mir nicht sicher bin ob das in diesem interval noch zuverlässig funktioniert)

Linuxhase  18.07.2017, 18:27

@LeonardM

oder per watch (wobei ich mir nicht sicher bin ob das in diesem interval noch zuverlässig funktioniert)

mir stellt sich bei so einem Vorhaben eher die Frage was das überhaupt für einen Sinn machen soll, denn wenn es Schwankungen in der Anbindung gibt, dann ist diese wohl eher nicht in diesem Intervall zu erkennen.

Linuxhase

1
Kieselsaeure  19.07.2017, 18:49

man könnte ja den watch prozess in den hintergrund schieben und die ausgabe in /dev/null. es ist keine tolle variante aber könnte für testzwecke wenn es sehr schnell gehen muss temporär reichen. natürlich wäre nen cronjob vergleichsweise besser

0
Kieselsaeure  19.07.2017, 18:50

mit der zeitangabe meinte ich in Erinnerung zu haben das es neben dem min wert (0.1sek) auch einen maximalen gab. eben nochmal nachgelesen, gibt es scheinbar nicht. nicht laut debian manpage zu watch.

0

Vermutlich hast Du die Parameter nicht richtig gesetzt in der crontab. Zeig doch mal die Zeile des Aufrufs.

Möglicherweise hast Du aber auch den crond noch gar nicht gestartet? Guck mal, ob der überhaupt läuft.

Wie sieht denn die crontab aus? Gibt es einen Fehler?

Du kannst auch ein Script machen;

while true
do
python speedtester.py
sleep 1800
done
Benniwartmann 
Fragesteller
 18.07.2017, 17:51

und das über crontab ausführen lassen?

0
kernash  18.07.2017, 17:53
@Benniwartmann

Nein, das ist ein Script das den Befehl selbstständig alle 30 Minuten ausführt. Mit cron brauchst du das nicht. Wie sieht denn dein crontab-Eintrag aus?

0
Benniwartmann 
Fragesteller
 18.07.2017, 17:56
@kernash

Hab warscheinlich einen fehler gemacht. Wie kann ich das Script im Hintergrund laufen lassen?

0
kernash  18.07.2017, 17:57
@Benniwartmann

Mit einem & am Schluss,

done &

Aber du solltest cron dafür nutzen, dafür ist es da.

0
Benniwartmann 
Fragesteller
 18.07.2017, 18:04
@kernash

ich würde das gerne per Script machen. Kann ich das mit Screen nutzen wenn ich das Script über eine .sh nutze?

0