• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

GELÖST: Programm zeitgesteuert ausführen

Ja Ja, ich weis. Das macht man mit der Crontab. ABER überlegt euch mal was zu diesem Problem (Ich find's einfach nicht raus):

Ich möchte den Firefox zeitgesteuert immer mal wieder starten.
BEDINGUNG: er MUSS in einem Fenster geöffnet werden.

Das habe ich schon probiert:
Natürlich bin ich auf meiner Suche zuerst über die crontab gestolpert. Ist auch ein schönes Teil, mit dem ich schon andere zeitgesteuerte Befehle ausgeführt habe. Also habe ich den Befehl firefox <URL> hier eingetragen und mit einem Zeitplan sowie den Benutzerangaben gefüttert und gewartet, was passiert.
Ihr könnt's euch denken: (sonst würde ich das hier nicht schreiben) nix. Absolut nix!
Nach weiterem Googeln und auch suche im Linux-Club nach einem Schalter, den ich dem ganzen mitgeben könnte, sowie dem Versuch, den Firefox über ein Skrit zu starten, das von der crontab gesteuert wird, bin ich zu dem Schluss gekommen: Alles was von der Crontab gesteuert wird, wird als Dämon aufgerufen und verschwindet daher irgendwo im Hintergrund.

Ich habe dann versucht, ein Programm zu finden, welches mitläuft und Programme ohne den crond selbstständig starten kann. ABER: Fehlanzeige.
Die Programme auf die immer wieder hingewiesen wurde war vcron und kcron. vcron ist scheints nur ein nicht so hübsches tool wie kcron aber macht in etwa genau das Gleiche: Es editiert die User-Crontab und schon sind wir wieder beim alten Problem: wenn etwas crontab-gesteuert aufgerufen wird, bleibt es wenn überhaupt im Hintergrund.

Kennt auf dieses Problem schon jemand die Lösung? Oder hat die mächtige Open-Source-Community auf dieses banale Problemchen tatsächlich noch keine Antwort gefunden?

Wenn ja, schlage ich hiermit die Gründung einer Selbsthilfe-Gruppe vor, in der wir unser gemeinsames Problem dann wöchentlich ausdiskutieren können. :D
 

TomcatMJ

Guru
Hi!
Du solltest zuerst in der /etc/profile dem User unter dessen Kennung der Firefox aufgerufen werden soll oder dem Rechner von dem aus der Aufruf gestartet werden soll erlauben eine Verbindung zum laufenden X-Server zu initiieren. Siehe dazu "man xhost" von dem du den passenden Aufruf dann in der /etc/profile einbauen solltest. Dann sollte dein Firefox-Aufruf über ein in der crontab eingebundenes Script laufen in dem vor dem eigentlichen Aufruf per passendem setzen der DISPLAY Variablen dem Firefox erstmal mitgeteilt werden sollte wo er denn starten soll.

Da das Ganze hier ein Fall für den Konsolen-Bereich ist, verleg ich den Thread mal dahin um ;-)

Bis denne,
Tom
 

panamajo

Guru
BrotBraeuner schrieb:
Alles was von der Crontab gesteuert wird, wird als Dämon aufgerufen und verschwindet daher irgendwo im Hintergrund.
Nein. Zumindest nicht nach meiner Definition von Dämon und Hintergrund.

BrotBraeuner schrieb:
Ich habe dann versucht, ein Programm zu finden, welches mitläuft und Programme ohne den crond selbstständig starten kann. ABER: Fehlanzeige.
atd

BrotBraeuner schrieb:
Kennt auf dieses Problem schon jemand die Lösung? Oder hat die mächtige Open-Source-Community auf dieses banale Problemchen tatsächlich noch keine Antwort gefunden?
Vielleicht verrätst du uns wodurch du ableitest dass cron deinen Anforderungen nicht genügt bzw. was du eigentlich machen willst?
 

regexer

Advanced Hacker
BrotBraeuner schrieb:
und gewartet, was passiert.
Ihr könnt's euch denken: (sonst würde ich das hier nicht schreiben) nix. Absolut nix!
Zwei Fragen:

1. Hast du eine System-Mail bekommen?
2. Wie sieht die entsprechende crontab-Zeile aus?
 
OP
B

BrotBraeuner

Member
Erstmal danke für die schnellen Antworten.
An Tom:
Also den Benutzer habe ich jetzt mit 'xhost +local:steffen' (hoffentlich) erfolgreich hinzugefügt. Das mit dem Skript habe ich noch nicht umgesetzt, da meine Skript-Kenntnisse nicht ganz so doll sind. Ich wollte eigentlich erstmal nur den Firefox aufrufen und das wars dann.
Probleme habe ich derzeit mit der DISPLAY-Option. Grundsätzlich weis ich, was das soll, aber: ich habe keine Ahnung wie mein Display heist :oops: :oops:

UND: Ja, ich bekenne mich, ein elender Mausschubser zu sein, der von Windows auf die "Helle Seite" gewechselt hat. :lol:i
Bitte habt Nachsicht mit mir!
 
OP
B

BrotBraeuner

Member
Kommando zurück: Habe den DISPLAY-Parameter gefunden!

Also müsste dann jetzt wohl der korrekte Aufrof etwa so lauten:

Code:
firefox --display=:0.0 http://www.google.de


Oder?
 
OP
B

BrotBraeuner

Member
Zunächst mal herzlichen dank an Tom!
Und hier nochmal die Zusammenfassung, wie ich das nun gemacht habe:

1. Als root folgenden Befehl eingegeben:
Code:
xhost +local:steffen
2. Ein (ganz kleines) Skript (namens FirefoxView) geschrieben, das mir geöffnete Feuerfüchse schließt und danach einen neuen öffnet:
Code:
#!/bin/sh
killall firefox-bin
firefox --display=:0.0 http://www.google.de
3. In die Crontab einen Eintrag gesetzt, der das Skript alle 31 Minuten ausführt:
Code:
*/31  *  *  *  *   steffen   /home/steffen/FirefoxView
4. Dem Firefox sagen, dass er keine Sessionwiederherstellung benutzen soll:
4.1 Als Adresse im Firefox
Code:
about:config
eintragen.
4.2 Rechtsklick in das Fenster ->New->Boolean und hier zunächst
Code:
browser.session.enabled
eintragen. Im nächsten Fenster dann noch false angeben und das wars.

Damit habe ich im Grunde also das erreicht, was ich wollte.
Doch für Verbesserungen bin ich immer offen.
Möglichkeiten wären jetzt nämlich noch, dass das Skript nur einen speziellen Firefox schließt und mir nicht sämtliche geöffneten Fenster killt, und dass das Skript auch dann noch ein Firefox-Fenster öffnen kann, wenn bereits eins offen ist (vielleicht mir der -remote-Option??).

Trotzdem nochmal vielen Dank!
 
A

Anonymous

Gast
Ein allgemeiner Tipp, auch wenn das Script in diesem Fall trotzdem zu funktionieren scheint.

Programmaufrufe in Cronjobs sollte man grundsaetzlich mit dem absoluten Pfad versehen, es kann auch ohne gutgehen, muss es aber nicht.

Also statt

Code:
firefox

schreibt man

Code:
/usr/bin/firefox

Den absoluten Pfad zu einer Anwendung zeigt der Befehl 'which Name_der_Anwendung' an.

Greetz,

RM
 

regexer

Advanced Hacker
BrotBraeuner schrieb:
3. In die Crontab einen Eintrag gesetzt, der das Skript alle 31 Minuten ausführt:
Code:
*/31  *  *  *  *   steffen   /home/steffen/FirefoxView
Nach meinem Verständnis wird das in jeder Minute durchgeführt, die ohne Rest durch 31 teilbar ist. Und das wäre nur einmal die Stunde, weil es die Minute 62 nicht gibt ...
 
OP
B

BrotBraeuner

Member
Ahaaaaa!
Na das erklärt alles.

Die Frage, die sich aber dann stellt ist: Wie kann man ein Intervall erzeugen, das länger als 30 Minuten ist und auch wirklich immer nach dieser Zeitspanne ausgeführt wird?

Und nun ein kleiner Tadel an die Sreiber der Crontab HOWTO's:
Warum wird da dann immer geschrieben:

"Das ist eine Angabe, die einen Befehl alle 5 Minuten ausführt."

Richtiger wäre also die Aussage:

"Das ist eine Angabe, die einen Befehl zu allen Minuten ausführt, die durch 5 teilbar sind."

ODER???
 

regexer

Advanced Hacker
BrotBraeuner schrieb:
Die Frage, die sich aber dann stellt ist: Wie kann man ein Intervall erzeugen, das länger als 30 Minuten ist und auch wirklich immer nach dieser Zeitspanne ausgeführt wird?
Erstmal sind die Angaben in der Crontab grundsätzlich absolut zu verstehen. Wenn eine "2" bei den Stunden drin steht, heißt das "2 Uhr" und nicht "in 2 Stunden". Die letzte Interpretation wäre auch etwas blöd, da ein Neustart des Systems erst einmal alle cronjobs ausführen würde.

Eine Invervallsteuerung von 31 Minuten dürfte auch sehr selten sein. Denn in der Regel will man ja, dass ein Job immer um eine gewisse Uhrzeit ausgeführt wird. Bei 31 Minuten würde das ja bedeuten: Der Job läuft z.B. heute um 12:00. Morgen würde er nicht um dieselbe Zeit sondern um 11:46 und 12:17 laufen.

Intervalle, die "nicht so krumm" sind, können eventuell abgebildet werden. Das trifft zum Beispiel auf echte Teiler von 1440 (=24*60) zu.

"Jede 90 Minuten beginnend mit 0:00" werden dann logischerweise:
Code:
0     0,3,6,9,12,15,18,21    * * * /my/script
30    1,4,7,10,13,16,19,22   * * * /my/script
"Jede 32 Minuten beginnend mit 0:00" würde auch gehen. Aber das werden dann etwas mehr Zeilen...

Und nun ein kleiner Tadel an die Sreiber der Crontab HOWTO's:
Warum wird da dann immer geschrieben:

"Das ist eine Angabe, die einen Befehl alle 5 Minuten ausführt."
man 5 crontab ist hier etwas genauer. Da steht zwar auch etwas von "every two hours" aber es ist mit einem Beispiel garniert, das dann für Klarheit sorgen sollte.
 
OP
B

BrotBraeuner

Member
Also grundsätzlich ist mir das ja jetzt schon klar, aber dennoch: dann nimm eben nicht 31 Minuten sondern zu Beispiel 45 Minuten.
Das wäre eine Zeitspanne,die vielleicht etwas praktischer wirkt.
So wie du es mir beschreibst müsste ich also dazu ausrechnen, welche startzeiten das wären und diese dann zusammengefasst angeben.
Bisschen kompliziert.

Damit nicht alle beim Systemstart gleichzeitig ausgeführt werden, wäre natürlich ein täglicher Zeitraum angebracht.

Alles in allem muss ich dann erst mal dabei bleiben, dass die möglichen Lösungen eigentlich noch recht unbefriedigend sind.

Falls dies mal einer liest, der sich mit programmieren auskennt: (ich leider nicht :oops: )
Ein wirklich schönes und meiner Meinung nach auch nützliches Tool für den Desktop wäre also ein Programm, das unabhängig vom cron beispielsweise minimiert im Systemabschnitt der KDE-Leiste mitläuft und dann kleine Programme für den Nutzer aufrufen kann (OK, KCron kann sowas auch)
ABER: es sollte die Möglichkeit haben, einen Zeitraum mit Start- und Endezeit zu haben in dem ein Zeitplan überhaupt ausgeführt werden kann, und in diesem Zeitraum dann zum Beispiel ein Programm oder meinetwegen nur ein Befehl ausgeführt werden kann.

Auf mein Beispiel oben bezogen wäre das etwa so:
Beginne täglich um 00:00 Uhr
Führe ab da den Befehl "firefox --display=:0.0 http://www.google.de" alle 31 Minuten aus.
Beende den Zeitplan täglich um 23:00 Uhr.
Wenn ich nun den Rechner um 07:00 Uhr starte, müsste das Programm dann einfach berechnen, wann der Zeitplan das nächste mal ausgeführt werden muss. (hier dann also um 07:14 Uhr) Das würde das Problem lösen, dass nicht alles auf einmal beim Systemstart ausgeführt wird.
Der Letzte Zeitpunkt an dem das Programm an diesem Tag dann noch ausgeführt wird wäre demnach 22:44 Uhr.
Und am nächsten Tag wieder das gleiche.
Eine zusätzlich mögliche Option denke ich wäre die Möglichkeit, dem Zeitplan eine "Lebensdauer" für das aufgerufene Programm oder den Befehl mitzugeben. Etwa, dass in diesem Fall der Firefox fünf Minuten später wieder geschlossen wird.

Ich denke es wäre auch möglich, mit einem Tool wie KCron die Benutzer-Crontab entsprechend zu modifizieren aber die oben genannten Optionen eben mit einem Rechenprogramm oder soetwas mit einzubinden.

Ich sage es nur sehr sehr ungern: Die Redmonder können genau das mit den "Geplanten Tasks" machen.
 

regexer

Advanced Hacker
BrotBraeuner schrieb:
Ich sage es nur sehr sehr ungern: Die Redmonder können genau das mit den "Geplanten Tasks" machen.
Nachdem ich vor ca. 10 Minuten das letzte mal richtig wüste Flüche über MS ACCESS ausgestoßen habe, kommt mir diese Bemerkung gerade recht ;)

"Alle 31 Minuten" könnte man auch in einem Script abbilden, dass ungefähr wiefolgt aussieht:
Code:
while true
do
   firefox usw.
   sleep 1860   # 31 Minuten
done
Allerdings würde das auch nicht exakt das treffen, was du willt. Aber mal ganz ehrlich: Die Logik des Redmonder Task-Planers kommen mir als Linux-Jünger ebenfalls sehr komisch vor. Vielleicht liegt es daran, dass ich mir ehrlich gesagt keinen Anwendungsfall aus meiner Praxis erinnern kann, bei dem ich soetwas gebraucht hätte.

Bei wirklich sensiblen Zeitgesteuerten jobs wäre es mir viel wichtiger, dass soetwas wie Sommer-/Winterzeit korrekt abgebildet wird.
Wie verhält sich der Redmonder Task-Planer, wenn in der Nacht von 2 Uhr auf 3 Uhr umgestellt wird (Winter- auf Sommerzeit) und ein Task für 2:30 geplant ist? Dafür hatte ich nämlich einen praktischen Anwendungsfall, und das wird unter Linux vorbildlich abgefangen.
 
Oben