Das Skript wird nicht über crontab ausgeführt, funktioniert jedoch als eigenständiges Skript

51

Ich habe ein Skript, das mich daran erinnert, meinen Computer nach uptimemehr als 3 Tagen neu zu starten (obwohl es jetzt auf 0 Tage gesetzt ist, um zu überprüfen, ob das Skript ausgeführt wird, da mein Computer nur über einen Tag aktiv war.).

Mir ist klar, dass es nicht das eleganteste Drehbuch ist, aber ich versuche es! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Ich habe es ausführbar gemacht chmod + x checkup.shund es funktioniert einwandfrei, wenn ich es über das Terminal starte./checkup.sh

Mein Crontab-Eintrag für dieses Skript lautet:

46 14 * * * /home/username/Desktop/./checkup.sh

So läuft es täglich um 14: 46h ...

Also ... ich denke, es sollte laufen, es sei denn, ich habe etwas wirklich Dummes getan. Denken Sie auch, dass es in Ordnung ist, dieses Bash-Skript zu verschieben /bin?

LiebeN
quelle
1
Ich würde es als allgemeine Best Practice in / opt / bin oder ~ / bin einfügen, um nicht zu verarschen, wo Pakete denken, dass Dinge sind.
RobotHumans
Wenn Sie das Skript folgendermaßen ausführen: /home/dnaneet/Desktop/./checkup.sh Funktioniert es? Ich würde /home/dnaneet/Desktop/checkup.sh
LnxSlck
@LnxSlck Ja, das Laufen /home/dnaneet/Desktop/./checkup.shfunktioniert einwandfrei . Aber /home/dnaneet/Desktop/checkup.shkann nicht richtig funktionieren? Weil es einen braucht ./?
Lieber
1
Ich glaube, cron weiß nichts über deine X-Sitzung.
Glenn Jackman
@glennjackman Also, was bedeutet das? Bedeutet das, dass das Ausführen eines solchen Skripts über crontab nicht zulässt, dass eine Popup-Nachricht in der Gnome-Umgebung angezeigt wird?
Liebes

Antworten:

71

Eins nach dem Anderen:

Zuerst geben wir Ihnen einen benutzerbasierten bin-Ordner:

cd ~/ && mkdir bin

Sie möchten Crontab verwenden. Beginnen wir mit etwas ganz Einfachem:

* * * * * touch /tmp/testing.txt

Okay, das funktioniert also

Lassen Sie uns nun versuchen, ein Skript auszuführen, das dasselbe tut

* * * * * /home/username/bin/touchtest.sh

Einmal in der Minute rennen, bis es funktioniert
Nein, Sie brauchen kein ./ in der Mitte der Linie. ./ ist für den Fall, dass Sie relative URLs angeben.
Okay, das funktioniert also

Versuchen wir nun, ein Skript auszuführen, das xmessage aufruft

* * * * * /home/username/bin/rebootwarn.sh

funktioniert nicht

Zunächst müssen wir uns nicht auf Umgebungsvariablen verlassen. Dies schließt Pfadeinstellungen, x11-Einstellungen oder alles andere ein (Python- und Ruby-Umgebungsvariablen fallen mir ein ...)

Lassen Sie uns unsere ein bisschen wie Anacrons richtige Cron-Datei aussehen. Ich habe dies als Test gespeichert

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Stellen Sie ein, um einmal pro Minute zu laufen

crontab test um es zu importieren

Weiter zum Skript

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Okay, das funktioniert also ... was haben wir getan?
Wir haben alle Befehle geändert, damit sie nicht von Pfaden abhängen, die wir nicht explizit festgelegt haben.
Wir haben unser Skript explizit mit bash ausgeführt.
Wir haben dem Skript mitgeteilt, dass wir erwarten, dass es auf DISPLAY: 0.0 ist

RobotHumans
quelle
Danke für die Antwort. Du hast gesagt "Lass uns so aussehen wie die richtige Cron-Datei von Anacron. Ich habe das als Test gespeichert.". UNSER WAS? Die Crontab-Datei? :-/
Lieber
Hier ist was ich beobachtet habe. Zuerst musste ich den Raum vorher und nachher =für die spezifizierende Linie loswerden DISPLAY. Zweitens wurde PATHdas Popup-Fenster nicht angezeigt, als ich meine crontab-Datei bearbeitete und wie vorgeschlagen hinzufügte und die Ausführungszeit auf einen späteren Zeitpunkt einstellte. Das Popup-Fenster zeigte sich jedoch gut, wenn das Skript mit /bin/bash... was gibt?
Lieber
Was weißt du, als ich mein Skript geändert habe, export DISPLAY=:0.0hat es gut funktioniert. Obwohl es eine signifikante Zeitspanne von ungefähr 5 Sekunden gab, nachdem die Uhr die Stunde schlug, zu der mein Popup-Fenster hätte angezeigt werden sollen ... Irgendwelche Vorschläge? Aber ja, Sie korrigieren das Drehbuch!
Lieber
Keine Ahnung, auf die 5 Sekunden Verzögerung.
RobotHumans
3
Ich finde es toll, wie Sie diese Schritte Schritt für Schritt durchgearbeitet und dann zusammengefasst haben - danke!
Jbobbins
10

Das Problem wurde gelöst, lesen Sie das Handbuch in Google:

Beschreibung:

  1. Ich habe ein Skript #!/bin/bashals Header
  2. Ich habe das Drehbuch aufgesetzt /home/wc3/palert/

Analyse:

  1. crontab kann mein Skript nicht ausführen
  2. Wenn ich es aber manuell starte, wird die Ausgabe angezeigt und ich kann das Ergebnis auch in meinem Web sehen
  3. Dies bedeutet, dass Crontab die Umgebung nicht so erhalten kann, wie wenn Sie Ihr Skript in Ihrem Skriptordner ausführen

Antworten:

  1. Platzieren Sie Ihre Umgebung in der folgenden Zeile in Ihrem Skript mit:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    Ändern Sie dies: /home/wc3/palert
    mit: dem Ort, an dem Sie Ihr Skript platzieren, z/home/budi/script.sh

Stichprobe:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Versuchen Sie, Ihr Skript auf crontab zu setzen.

budi satriyo
quelle
funktioniert bei mir nicht
John Joe
Arbeite wie ein Zauber für mich!
1rq3fea324wre