Warum funktioniert es nicht, ein Skript in /etc/cron.hourly abzulegen?

15

Ich habe ein ausführbares Skript eingefügt /etc/cron.hourly, aber dieses Skript wurde nicht jede Stunde ausgeführt, sondern überhaupt nicht.

Hier ist das Skript (Hour-Sound), das ich gemacht habe:

#! / bin / bash
mplayer ~ / Music / sfx_msg-highlight.wv &> / dev / null &
spd-say -r -50 -p 50 -t male3 "Es ist jetzt $ (Datum +"% l% p ")"
benachrichtige-sende "Es ist:" "$ (Datum +"% l% p ") jetzt." -i ~ / Pictures / "first tee.png" -t 5000

Meine Crontab ist:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

Während die mplayerund spd-sayBefehle korrekt ausgeführt werden, das notify-sendist es nicht. Ich habe auch versucht, Fehler in eine Datei umzuleiten:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Aber das zeigte keine Ausgabe. Was mache ich falsch?

Schwarzer Block
quelle
Nur um sicherzugehen, haben Sie das Skript ausführbar gemacht? im Besitz von root? Was passiert, wenn Sie das Skript vom Terminal aus ausführen oder dort ein einfaches Skript platzieren? Hat /etc/crontabdie run-partsZeile zum Ausführen von Stundenaufträgen cronaus dem Verzeichnis?
Heemayl
Ausführbar: Ja, das Ausführen des Skripts funktioniert im Verzeichnis /etc/cron.hourly einwandfrei. Sie wissen nicht, wie Sie dies überprüfen sollen. Ist dies in den Startup-Anwendungen der Fall? @heemayl
Black Block
1
Hat die /etc/crontabDatei die Zeile 17 * * * * root cd / && run-parts --report /etc/cron.hourly?
Heemayl
1
Bitte poste keine Screenshots von Texten . Insbesondere, wenn dieser Text in einem transparenten Terminalfenster angezeigt wird und ablenkende Farben enthält.
Terdon

Antworten:

24

Wie Sie wahrscheinlich in den Kommentaren zu Ihrer Frage gesehen haben, werden die Cronjobs in /etc/cron.hourly(und den anderen, ähnlichen Verzeichnissen) von ausgeführt run-parts. run-partsist ein wenig wählerisch bei Dateinamen. Standardmäßig werden keine Dateien ausgeführt, deren Dateinamen etwas anderes als (alle von ASCII) enthalten.

  • Großbuchstaben
  • Kleinbuchstaben
  • Ziffern
  • unterstreicht
  • Striche ("Minuszeichen")

Wenn Ihr Skript beispielsweise den Dateinamen "myscript.sh" hat, wird es einfach ignoriert, da run-partsder Punkt nicht gefällt.

Henning Kockerbeck
quelle
1- Hier sind meine Dateien: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- Haben Sie ein Skript in /etc/cron.hourly ausprobiert und mit Ihnen gearbeitet?
Black Block
2
Ich habe gerade ein kleines Skript getestet, das gerade "Hallo" in eine Datei in / tmp geschrieben hat, und es hat problemlos funktioniert. Nur für den Fall, dass Sie wissen, dass die Skripte /etc/cron.hourlynicht unbedingt "zur vollen Stunde" ausgeführt werden? Wenn Ihr Cronjob /etc/crontabauf der Minutenposition 17 hat, werden die Skripte um 00:17, 01:17 und so weiter ausgeführt. Und wieder nur für den Fall, dass die Berechtigungen des Skripts dem Benutzer root erlauben, sie auszuführen?
Henning Kockerbeck
Yah, aber dieses Drehbuch von mir läuft zu keiner Zeit. und zur Erlaubnis siehe hier: mediafire.com/view/psnb4bflawdlyly/…
Black Block
Vielleicht ist es tatsächlich ein Berechtigungsproblem. Ich weiß, dass Skripte im Allgemeinen /etc/cron.d/keine Schreib- oder Ausführungsberechtigungen für "group" oder "others" haben dürfen. "owner" benötigt die Ausführungsberechtigung, "group" und "others" müssen nur die Leseberechtigung besitzen. Vielleicht trifft das /etc/cron.hourlyauch zu, obwohl ich das nicht getestet habe.
Henning Kockerbeck
Ok, dann habe ich die Berechtigung für meine Datei mediafire.com/view/s2lq63u7z54ohbo/… geändert , mit der die Gruppe, bei der es sich um die Stammgruppe handelt, schreibgeschützt ist, und andere. Wird dies also zu Problemen führen?
Black Block
5

Ein Problem ist, dass Sie versuchen, eine grafische Anwendung ( notify-send) von cron aus auszuführen. Das braucht ein bisschen Feineinstellung. Sie müssen XAUTHORITYund DISPLAYVariablen in der crontab festlegen , damit eine Verbindung zu Ihrer laufenden X-Sitzung hergestellt werden kann, und Sie müssen festlegen, XDG_RUNTIME_DIRdass eine Verbindung zu Ihrer pulseaudio-Sitzung hergestellt werden kann. Leider müssen diese Einstellungen in der Crontab selbst vorgenommen werden, sodass Sie sie nicht verwenden können /etc/cron.hourly. Führen Sie stattdessen die folgenden crontab -eZeilen aus und fügen Sie sie hinzu:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Ändern Sie den Wert von XDG_RUNTIME_DIRin das, was echovon einem Terminal zurückgegeben wird. Auf meinem System ist dies:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Es wird wahrscheinlich dasselbe bei dir sein, aber überprüfe es zuerst. Jetzt wird Ihr Skript jede Stunde ausgeführt und sollte wie erwartet funktionieren.

terdon
quelle
Ist es das, was du meinst, mediafire.com/view/ucjpvu8b41n3hue/… . Das hat bei mir nicht funktioniert.
Black Block
Ich denke, wenn das Problem im Benachrichtigungs-Send lag, warum lief dann ein anderer Befehl nicht so gut (wie mplayer)?
Black Block
@BlackBlock gibt es mehrere Probleme. i) notify-sendmuss die XAUTHORITYund DISPLAYVariablen gesetzt werden , und ii) mplayermuss den XDG_RUNTIME_DIRSatz sein. Hast du meinen Vorschlag probiert? Damit sollten beide Probleme behoben sein. Sie hatten wahrscheinlich auch Namensprobleme, da dies run-partsin der anderen Antwort erläutert wurde.
Terdon
Warum hat das dann bei mir nicht geklappt? Ich werde wütend sein! Siehe mein Bild im 1. Kommentar zu Ihrer Antwort
Black Block
@BlackBlock nein! Sie bearbeiten /etc/crontab, tun Sie das nicht. Sie möchten, dass dies als Ihr Benutzer und nicht als root ausgeführt wird und diese Datei trotzdem ein anderes Format hat. Tun Sie einfach, was ich in meiner Antwort gesagt habe, crontab -eund fügen Sie die Zeilen dort hinzu.
Terdon
3

Ein Skript, das mit endet, .shwird nicht in folgendem /etc/cron.hourlyOrdner ausgeführt:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
Links oder Binärdateien in einem Verzeichnis, das von run-pars (wie /etc/cron.daily) verwaltet wird, werden nicht ausgeführt, wenn ein Punkt in enthalten ist ihr Name.

Benennen Sie das Skript um

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

oder setzen Sie den Skriptaufruf in

/etc/crontab

das erlaubt das .shende

rubo77
quelle
1

Verwenden Sie kein Skript mit der Erweiterung (abc.sh) und fügen Sie Ihren Platzbedarf hinzu. (cron.hours).

Füge deinen Code in die ABC-Datei ein und speichere ihn (für deinen Bedarf) (dies sollte ein bash-Befehl sein).

verwenden

sudo chmod +x abc

Befehl, um eine ausführbare Datei zu erstellen.

edit etc/cronrtab file

Es gibt eine vordefinierte Anzahl von Zeilen. Bearbeiten Sie die Zeile von Minuten zu Stunden, und speichern Sie sie.

dann läuft es einwandfrei.

Aruna D Mahagamage
quelle