Cron als nicht root?

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hi,
    ich hab schon seit einer ganzen Weile meinen Pi unter anderem als Wecker im Einsatz und das auch sehr stabil und zuverlässig. Gesteuert hab ich das ganze immer über crontab. Beim Durchgehen meiner ToDo wollte ich mich grad mal an einen Punkt von vor einem guten halben Jahr machen: Webinterface für den Wecker. Bevor ich mich jetzt allerdings daran mache, was schönes zu bauen, habe ich erst mal rumprobiert.
    Was ich schon mal probiert hab und wo es schon scheitert... Ich hab unter /etc/cron.d/wecker eine Datei angelegt, über die ich den Wecker steuern will. Das Problem ist, dass die Datei nur dann und genau dann gelesen und interpretiert wird, wenn sie root gehört und auch nur root rein schreiben darf. Da mein nginx Server unter www-data läuft, steht das im Konflikt. Jemand 'ne Idee, wie ich als wwwdata zeitgesteuert Skripte starten kann?
    Vielen Dank im Voraus

  • Oder du hinterlegst in der Crontab des root-Benutzers (sudo crontab -e) ein Script welches von www-data beschrieben werden darf ...

    Kommt halt drauf an was in diesem Script oder der crontab drin steht bzw ausgeführt werden soll? Wenn da sowieso Befehle drin sind die mit root-Rechten ausgeführt werden sollen, wär son hickhack über ne crontab von www-data eh überflüssig und mein Vorschlag wäre sinniger :fies:

  • dbv: joa, das klingt nach einer Idee. Werde ich später mal gucken. Prinzipiell braucht mein Wecker auch keine root Rechte.

    meigrafd: Ich verstehe deinen Ansatz nicht ganz. Ich soll im Crontab von root ein Skript hinterlegen? Und dann? Jede Minute ausführen oder wie? Dann würde ich glaub lieber ein Skript im Hintergrund laufen haben, dass immer scannt und dann eine Minute schläft. Sonst knallt mir das ja die Logs voll

    Einmal editiert, zuletzt von KrawallKurt (24. November 2014 um 12:13)

  • Naja der Wecker wird doch vermutlich eh nur minimal Minuten handhaben, oder? Also du sagst ja WECKER, nicht UHR... Demnach wird wohl keiner um 12:30:30 geweckt werden wollen :D

    Ein permanent im Hintergrund laufendes Script verballert auch permanent CPU+RAM, egal ob es gerade etwas zu tun hat oder nicht. Und falls dieses mal crasht läuft gar nix mehr, man bräuchte also auch noch ein Watchdog Script in der Crontab um zu prüfen ob das Hauptscript noch läuft und falls nicht wirds erneut gestartet...

    Also wieso solch ein Aufwand betreiben wenns denn einfacher wäre nur ein crontab Eintrag zu haben, das eine Script prüft dann ob die aktuelle Uhrzeit der Weckzeit entspricht und führt dann eben eine entsprechende Aktion aus... Sowas nennt sich "Timetable Aktion".

    ^- Sowas hab ich auch laufen, ein relativ großes Projekt sogar... In einer Datenbank wird hinterlegt "wann" etwas ausgeführt werden soll, in Form des Unixtimestamps, und ein minütliches Crontabscript prüft dann ob "jetzt" der Zeit des Datenbankeintrags entspricht...

    Beispielsweise erzeugst du eine normale Textdatei in die www-data (also der Webserver) schreiben darf. In dieser Datei stehen dann eine eindeutige ID, die Weckzeiten und ggf weitere Anweisungen (Weckton, Schlummerzeit etc). Das crontab Script prüft diese Datei dann unabhängig davon ob oder was eingetragen wird.

    /tmp/Wecker.txt

    Code
    1 1416915145 /tmp/wecklied1.mp3 3
    2 1416828339 /tmp/wecklied4.mp3 3

    Erklärung: 1 ist die eindeutige Weck-ID, 1416915145 ist Morgen Mittag um 12:32, abgespielt werden soll /tmp/wecklied1.mp3, Schlummerzeit 3 Minuten

    Über die eindeutige Weck-ID kann man den Eintrag später auch wieder löschen. Den Unixtimestamp 1416915145 kannst du mit folgendem Befehl umwandeln und kontrollieren: date -d@1416915145

    Das minütlich auszuführende Script könnte dann z. B. wie folgt aussehen:

    Das Script ist natürlich noch nicht vollständig, soll aber auch nur veranschaulichen wie es aussehen könnte.


    Das wäre aus meiner Sicht der einfachste,übersichtlichste und flexibelste Lösungsweg

  • hmm, ja. ich finde minütliche Crontabs irgendwie nicht so hübsch. Ich guck mal, ob ich den Wecker auch einfach als www-data starten kann mit @dbv's Variante

    Oh mann... vielleicht mach ich doch deine Variante meigrafd. Das ganze wird ganz schön kompliziert anders, bzw www-data braucht da unangenehm viele Rechte

    Gibt's noch ne Möglichkeit, sich mit solchen minütlichen cronjobs nicht die Logs voll zu müllen? also cron wird bei mir im syslog eh nicht protokolliert, aber die /var/log/cron.log* Dateien können da schon recht groß werden. Allein durch den einen Job kommen da vor dem rotate schon über 10k Zeilen zusammen :-/ Das war auch so der Grund, warum ich das erst nicht so machen wollte..

    Einmal editiert, zuletzt von KrawallKurt (24. November 2014 um 20:27)

  • Mein Skript sieht jetzt so aus:

    Hab mich da stark an deinem orientiert meigrafd. Einzige Kritikpunkte: Ich glaub, bei dir könnte es mit Kommentarzeilen problematisch werden. Und ich hab meine Weckzeiten gern persistent, so dass mein Wecker mich auch nach einem Stromausfall wecken kann. /tmp ist da eher ungeeignet, wenn man eine RAM-Disk verwendet ;)
    Scheint jetzt auf jeden Fall mal zu funktionieren. Nur die Sache mit dem vollen Log stört mich noch. Vielleicht weiß da ja noch jemand, wie ich das Problem lösen kann.

    Ansonsten mach ich mich mal demnächst ans Webinterface. Da wird's bestimmt demnächst n neuen Thread mit Fragen von mir geben ;)

    Danke nochmal für eure Hilfe

    Einmal editiert, zuletzt von KrawallKurt (24. November 2014 um 20:42)


  • Hab mich da stark an deinem orientiert meigrafd. Einzige Kritikpunkte: Ich glaub, bei dir könnte es mit Kommentarzeilen problematisch werden.
    Und ich hab meine Weckzeiten gern persistent, so dass mein Wecker mich auch nach einem Stromausfall wecken kann. /tmp ist da eher ungeeignet, wenn man eine RAM-Disk verwendet ;)

    Was war an

    Das Script ist natürlich noch nicht vollständig, soll aber auch nur veranschaulichen wie es aussehen könnte.

    unverständlich? :-/

    /tmp ist zudem nicht immer eine RAMdisk bzw tmpfs, normal muss das erst aktiviert werden - zumindest ist das auf meinen bisher aufgesetzten raspbian's so :fies:

    Aber egal - mein BEISPIEL sollte nur Veranschaulichen wie es funktionieren könnte; wo Deine Textdatei letztlich liegt, kann und will ich nicht vorhersehen ...


    Nur die Sache mit dem vollen Log stört mich noch. Vielleicht weiß da ja noch jemand, wie ich das Problem lösen kann.

    Forumsuche nach: varlog

    Ansonsten ist bei mir die /var/log/cron.log laut meiner /etc/rsyslog.conf nicht aktiviert - Was für ein System hast du da :huh:
    Man kann aber auch den Eintrag

    Code
    cron.*                /var/log/cron.log


    ändern in:

    Code
    cron.err                /var/log/cron.log

    ..dann werden nur errors, critical, alert und emergency/panic Nachrichten geloggt.
    (rsyslog nicht vergessen neu zu starten)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!