crontabs @reboot funktioniert nur für root?


64

man 5 crontab ist ziemlich klar, wie man crontab benutzt, um ein Skript beim Booten auszuführen:

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the `@` character:
   @reboot    :    Run once after reboot.

Daher habe ich meiner crontab eine einzelne Zeile hinzugefügt (unter meinem Benutzerkonto, nicht root):

@reboot     /home/me/myscript.sh

Aber aus irgendeinem Grund würde myscript.sh beim Neustart des Computers nicht ausgeführt. (Es funktioniert einwandfrei, wenn ich es über die Befehlszeile aufrufe, es ist also kein Berechtigungsproblem.)

Was vermisse ich?


Aktualisieren Sie, um @ Anthons Fragen zu beantworten:

  1. Oracle-Linux-Version: 5.8 (uname: 2.6.32-300.39.2.el5uek # 1 SMP)
  2. Cron-Version: vixie-cron-4.1-81.el5.x86_64
  3. Ja, /home ist eine gemountete Partition. Sieht so aus, als wäre das das Problem. Wie kann ich das umgehen?
  4. Derzeit wird myscript.shnur eine Textnachricht an eine Datei in Echo /home/me.

2
Ihr Benutzer crontab unterstützt die @reboot-Option nicht. Es gibt einige Crontab-Layouts, sobald Sie anfangen, herumzusuchen.
X Tian

@XTian Danke. Was ist die empfohlene Methode, um ein Skript beim Neustart als ein anderer Benutzer als root auszuführen?
17.

2
Was Sie vermissen, ist unklar, aber was wir vermissen, sind Details. Welche Version von Oracle-Linux verwenden Sie? Welche Version von Cron hast du? Ist /homeeine gemountete Partition? Was sind die Inhalte von dir /home/me/myscript.sh?
Anthon

1
Wenn Sie Oracle Lin verwenden. ver. 5 Es gibt dieses Changelog zu Problemen mit Vixie-Cron + @reboot. oss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm

1
@ Daniel - ist myscript.shausführbar? chmod +x myscript.sh.
SLM

Antworten:


47

Dies kann ein verwirrendes Thema sein, da es unterschiedliche Implementierungen von cron gibt. Es gab auch einige Fehler, die diese Funktion beschädigt haben, und einige Anwendungsfälle, in denen dies einfach nicht funktioniert, insbesondere wenn Sie einen Shutdown / Boot-Vorgang oder einen Neustart durchführen.

Bugs

Datenpunkt Nr. 1

Ein solcher Fehler in Debian wird hier behandelt: cron: @reboot-Jobs werden nicht ausgeführt . Dies scheint auch in Ubuntu angekommen zu sein, was ich nicht direkt bestätigen kann.

Datenpunkt Nr. 2

Beweise für den Fehler in Ubuntu scheinen hier in diesem SO- Fragen- und Antworten-Fragebogen mit dem Titel " @reboot cronjob not executing" bestätigt zu sein .

Auszug

Kommentar # 1: .... 3) Ihre Version von Crond unterstützt @reboot möglicherweise nicht. Verwenden Sie Vix's Crond? ... zeige Ergebnisse von crontab -l -u user

Kommentar Nr. 2: ... Es könnte eine gute Idee sein, es als Init-Skript einzurichten, anstatt sich auf eine bestimmte Version von crons @reboot zu verlassen.

Kommentar # 3: ... @MarkRoberts hat den Neustart entfernt und das 1 * * * * in * / 1 * * * * geändert, Problem ist gelöst! Wohin sende ich das Wiederholungszeichen? Danke!

Die akzeptierte Antwort in diesem Q & A hatte auch diesen Kommentar:

Mir scheint, Lubuntu unterstützt die @ Reboot Cron-Syntax nicht.

Zusätzliche Beweise

Datenpunkt Nr. 3

Als zusätzlichen Beweis gab es diesen Thread, dass jemand genau dasselbe versuchte und frustriert darüber wurde, dass es nicht funktionierte. Es trägt den Titel: Thread: Cron - @reboot-Jobs funktionieren nicht .

Auszug

Betreff: Cron - @reboot Jobs funktionieren nicht

Zitat Zitat von ceallred Beitrag anzeigen Dies bringt mich um ... Versuchte das Wrapper-Skript. Beim manuellen Ausführen wird die Protokolldatei erstellt. Ein Neustart des Jobs wird nicht ausgeführt oder es wird keine Protokolldatei erstellt.

Syslog zeigt, dass CRON den Job ausgeführt hat ... aber auch hier keine Ausgabe und der Prozess läuft nicht. Jul 15 20:07:45 RavenWing cron [1026]: (CRON) INFO (Ausführen von @reboot-Jobs) Jul 15 20:07:45 RavenWing CRON [1053]: (ceallred) CMD (/ home / ceallred / Scripts / run_spideroak. sh> /home/ceallred/Scripts/SpiderOak.log 2> & 1 &)

Es scheint, als würde cron den Befehl @reboot nicht mögen ... Irgendwelche anderen Ideen?

Okay ... Teilweise gelöst. Ich werde diesen als gelöst markieren und einen neuen Thread mit der neuen Ausgabe beginnen .....

Ich denke, die Antwort war, dass mein verschlüsseltes Home-Verzeichnis nicht gemountet wurde, als CRON versuchte, das Skript auszuführen (gespeichert in / home / username / scripts). Nach / usr / scripts verschoben und der Job wird wie erwartet ausgeführt.

Jetzt scheint es also ein Spideroak-Problem zu sein. Der Vorgang wird gestartet, aber bis der Startvorgang abgeschlossen ist, ist er beendet. Ich vermute einen Absturz aus irgendeinem Grund .... Neuer Thread, um danach zu fragen.

Danke für all die Hilfe!

Sobald der oben genannte Benutzer sein Problem herausgefunden hatte, war er in der Lage, @rebootdie Crontab-Eingabe eines Benutzers zu bearbeiten.

Ich bin nicht ganz sicher, welche Version von cron unter Ubuntu verwendet wird, aber dies scheint darauf hinzudeuten, dass der Benutzer es auch verwenden kann @rebootoder dass der Fehler in späteren Versionen von cron irgendwann behoben wurde.

Datenpunkt Nr. 4

Ich habe auf CentOS 6 folgendes getestet und es hat funktioniert.

Beispiel

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

Ich habe dann das System neu gestartet.

$ sudo reboot

Nach dem Neustart.

$ cat reboot.txt 
hi

Nehmen Sie sich Zeit

  1. Diese Funktion scheint sowohl für System- als auch für Benutzer-Crontab-Einträge unterstützt zu werden.
  2. Sie müssen sicherstellen, dass es in Ihrer speziellen Distribution und / oder Version des Cron-Pakets unterstützt wird / funktioniert.

Um mehr darüber zu erfahren, wie der eigentliche Mechanismus funktioniert, @rebootbin ich auf diesen Blog-Beitrag gestoßen, in dem es um die Innereien geht. Es trägt den Titel: @reboot - erklärt einfache Cron-Magie .

Crond debuggen

Sie können die Ausführlichkeit von cronderhöhen, indem Sie der Konfigurationsdatei unter RHEL / CentOS / Fedora-basierten Distributionen Folgendes hinzufügen.

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"

Die gültigen Ebenen sind 0, 1 oder 2. Um diese Datei auf die Standardprotokollierungsstufe zurückzusetzen, entfernen "-L 2"Sie einfach die, wenn Sie mit dem Debuggen der Situation fertig sind.


Habe gestern einen Kommentar bekommen , deine Antwort angeschaut und mich nach einem erholsamen Schlaf entschlossen zu antworten. Richten Sie eine VM ein, versuchen Sie es erneut mit @reboot, und möchten Sie meine Antwort veröffentlichen. Erst dann haben Sie Ihre Antwort "umformuliert" :-(
Anthon,

@Anthon - Entschuldigung, ich habe gestern schnell geantwortet und dann weiter recherchiert und sehr widersprüchliche Details gefunden. Als ich den Fehler in Debian und Ubuntu entdeckte, wurde mir klar, was im Spiel war. Ich habe gesehen, dass es auf CentOS funktioniert und es so zusammengestellt, dass @rebootes bei bestimmten Benutzern in Ordnung und bei anderen scheinbar fehlerhaft / defekt ist. Daher die Verwirrung.
SLM

Abgesehen davon, dass das OP nur wenige Details enthält, können Sie in Ihrem Skript leicht etwas verwenden, das noch nicht funktioniert (beim Booten), wodurch es fehlschlägt, oder es befindet sich auf einer noch nicht bereitgestellten CD. Meine Antwort, die das OP kommentierte, wurde ebenfalls von einem Dritten bestätigt. Es ist das Problem mit dem schwarzen Schwan ...
Anthon

@Anthon - ja einer meiner Datenpunkte war genau das. @rebootfunktionierte, sobald Sie bemerkten, dass versucht wurde, auf ein verschlüsseltes Laufwerk zuzugreifen, das noch nicht gemountet war.
SLM

3
Sie könnten der Fehler in Ubuntu darauf hinweisen, dass einfach durch das Hinzufügen einer Verzögerung gelöst: @reboot sleep 60; <your command>. Um den Thread zu zitieren: "Ich vermute, dass die @reboot-Direktive von cron zu früh im Boot-Prozess ausgeführt wird"
pzkpfw

12

Ich habe festgestellt, dass ich auf meinem Ubuntu-Rechner zum Zeitpunkt @reboot noch keinen Zugriff auf DNS-Dienste habe. Dadurch konnte ich keine Remote-Volumes aktivieren. Diese blöde, aber einfache Lösung hat funktioniert:

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(in root cron; letzte Teile nur zum Debuggen)


Dies ist das einzige, was unter Ubuntu 16.04 für Nicht-Root-Benutzer funktioniert!
Aleksandar Pavić

Arbeitet nicht an Debian 8 jessie (Gnome 3). :(
Tadej

Dies funktionierte für mich, wenn es darum ging, freigegebene VMWare-Ordner an einem separaten Speicherort bereitzustellen.
Jgshawkey

3

Ich habe auch Mac OSX und ich hatte das gleiche Problem, bei dem mein Skript nicht ausgeführt wurde. aber als ich mein Drehbuch reparierte, um zu mögen

@reboot   cd /home/me/  && sh myscript.sh

es hat gut funktioniert für mich. Stellen Sie sicher, dass Ihre Shell-Datei ausführbar ist, indem Sie den Befehl ausführen

chmod +x myscript.sh

2

Ich weiß nicht, ob Sie dies bereits gelöst haben oder ob eine der oben genannten Lösungen die von Ihnen benötigte war, aber eine andere Möglichkeit ist:

Wenn Sie Ihr / home-Verzeichnis verschlüsselt haben, ist es möglicherweise erst nach der Anmeldung verfügbar, dh, es ist beim Neustart nicht verfügbar.

In diesem Szenario können Sie Ihre Skripte an einen anderen Speicherort verschieben, z. B. / srv oder / opt oder / usr / local / bin / usw.


1

Nimm eine Neuinstallation von Ubuntu Gnome 13.10 (Standardbenutzer in meinem Fall: avanderneut).

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ sudo reboot
[sudo] password for avanderneut: 

Und stellen Sie sicher, dass die Datei nach dem Neustart vorhanden /var/tmp/xxxist, obwohl sie vor dem Neustart nicht vorhanden war.

Dies wurde mit Cron Version 3.0 gemacht.

Sie müssen sicherstellen, dass keine Service-Disks usw. verwendet werden, die zum Zeitpunkt der Ausführung des Skripts möglicherweise nicht verfügbar sind. Beginnen Sie mit etwas Einfachem wie dem oben genannten und stellen Sie sicher, dass es keine Terminalausgabe gibt, da E-Mails wahrscheinlich nicht funktionieren.

Möglicherweise benötigen Sie auch einen aktuelleren Cron (oder ein Upgrade von Oracle-Linux), wenn dies bei Ihnen nicht funktioniert hat und Sie diese Funktion benötigen.


Ich habe mein OP aktualisiert, um Ihre Fragen zu beantworten. Es stellte sich heraus, dass Ihr Verdacht von Anfang an richtig war: Das Skript, das beim Neustart ausgeführt werden soll, befindet sich auf einer bereitstellbaren /dev/mapper/VolGroup00-LogVol01Partition.
24.

@ Daniel Danke, dass du mich informiert hast. Ich bin froh, dass du den Täter gefunden hast. Ich bin mir nicht sicher, ob Sie den Start von cron verzögern können, bis die Partitionen gemountet sind. Ein Teil dieses Starts erfolgt parallel und Sie müssten die Abhängigkeiten ändern. Damit und einer möglichen Pause möchte ich mich nicht anlegen cron. Sie sollten IMHO einen anderen Weg als crontab & @reboot einschlagen, um beim Start als Benutzer etwas auszuführen.
Anthon

0

Ich würde zu der Frage ja sagen. Hatte gerade Probleme beim Ausführen von cron beim Neustart (Debian 3.10.70) und schaffte es zu lösen mit:

@reboot root /usr/bin/python3 /path/to/script

Und am Ende ein Zeilenvorschubzeichen '\ n'

Dies ist der Inhalt der Datei:

/etc/cron.d/runOnReboot

Schließlich denke ich, dass es sich lohnt, ein Abstract von zu erwähnen man 5 crontab

... Das Format eines Cron-Befehls entspricht weitgehend dem V7-Standard mit einer Reihe von aufwärtskompatiblen Erweiterungen. Jede Zeile enthält fünf Zeit- und Datumsfelder, gefolgt von einem Befehl und einem Zeilenumbruchzeichen ('\ n'). Die System-Crontab (/ etc / crontab) verwendet dasselbe Format, außer dass der Benutzername für den Befehl nach den Feldern für Uhrzeit und Datum und vor dem Befehl angegeben wird. Die Felder können durch Leerzeichen oder Tabulatoren getrennt sein. Die maximal zulässige Länge für das Befehlsfeld beträgt 998 Zeichen. ...


0

Zunächst sollten Sie sich als root anmelden:

sudo -i

Dann öffne crontab:

crontab -e

Fügen Sie danach Ihr Skript wie folgt zu crontab als root hinzu:

@reboot root / home / user1 / Desktop / my_script

Als Ergebnis habe ich gesehen, dass mein Skript richtig funktioniert.

Hinweis: Wenn Sie crontab mit Ihrem aktuellen Benutzer bearbeiten, kann der Neustart Ihr Skript nicht ordnungsgemäß aufrufen.


-1

prueba:

usuario @ ubuntu: ~ $ touch script.sh usuario @ ubuntu: ~ $ chmod + x script.sh

usuario @ ubuntu: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

Speichern Sie Ihren PC und starten Sie ihn neu

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.