it-swarm.com.de

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

Ich habe ein Skript, das mich daran erinnert, meinen Computer neu zu starten, wenn uptime länger als 3 Tage ist (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 mit chmod + x checkup.sh ausführbar gemacht und es funktioniert einwandfrei, wenn ich es über ./checkup.sh vom Terminal aus starte.

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 nach /bin zu verschieben?

48
dearN

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 laufen, 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 ... was haben wir gemacht?
Wir haben alle Befehle so geändert, dass sie nicht von Pfaden abhängen, die wir nicht explizit festgelegt haben
Wir haben unser Skript explizit mit bash ausgeführt
Wir sagten dem Skript, dass wir erwarten, auf DISPLAY zu sein: 0.0

69
RobotHumans

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

beschreibung:

  1. Ich habe Skript mit #!/bin/bash als Header
  2. Ich habe das Skript auf /home/wc3/palert/ gesetzt

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 gestalten kann, wie 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
    

    ändere 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.

8
budi satriyo