Wie füge ich meiner Crontab einen Eintrag hinzu?

13

Ich benutze Crontab zum ersten Mal. Sie möchten einige sehr einfache Test-Cron-Tasks schreiben und ausführen.

$crontab * * * * * echo "Hi"

produziert nichts.

crontab */1 * * * * echo "hi"

sagt */1: No such file or directory.

Wie liste ich die aktuell ausgeführten Cron-Tasks auf (nicht nur die, die ich besitze, sondern auch die, die von anderen Benutzern wie root gestartet wurden)?

Und wie lösche ich eine bestimmte Cron-Aufgabe?

xyz
quelle
Anweisungen zum Bearbeiten und Erstellen von Cron-Jobs sowie eine Erläuterung zur Dateistruktur finden
KJS,

Antworten:

21

Sie können nicht so verwenden crontab. Hier erfahren Sie man crontab, wie Sie dieses Dienstprogramm richtig aufrufen.

Sie möchten crontab -edie Cron-Einträge des aktuellen Benutzers bearbeiten (Sie können Zeilen hinzufügen / ändern / entfernen). Hiermit können crontab -lSie die aktuelle Liste der konfigurierten Aufgaben anzeigen.

Wenn Sie die Crontabs anderer Benutzer sehen möchten, ist dies nicht möglich, ohne bei Standardinstallationen als Root angemeldet zu sein. Unter Wie liste ich alle Cron-Jobs für alle Benutzer auf, um alle aufzulisten (als root).

Hinweis: Seien Sie sehr vorsichtig, wenn Sie Shell-Globbing-Zeichen in der Befehlszeile verwenden ( *und ?insbesondere). *wird auf die Liste der Dateien im aktuellen Verzeichnis erweitert, was unerwartete Auswirkungen haben kann. Wenn Sie *etwas als Argument übergeben möchten , zitieren Sie es ( '*').

Matte
quelle
Also mache ich crontab -e und im Editor gebe ich den Eintrag * / 1 * * * * echo "hi" ein und wenn ich diese Datei speichere, sehe ich die Meldung crontab: Installiere neue crontab. Aber ich sehe die Hi-Meldungen nicht auf dem Bildschirm. Was vermisse ich jetzt? Vielen Dank.
XYZ
2
Die Ausgabe von crontab wird niemals auf Ihren "Bildschirm" gelangen. Aus der POSIX-Manpage für crontab: "Wenn Standardausgabe und Standardfehler nicht durch Befehle umgeleitet werden, die vom crontab-Eintrag ausgeführt werden, werden alle generierten Ausgaben oder Fehler über eine implementierungsabhängige Methode an den Benutzer gesendet."
Mat
1
Die Ausgabe des Auftrags wird an die lokale Mailbox des Auftraggebers gesendet. (Ausführen mailvon der Befehlszeile sollten Sie Ihre lokale Mail - Box zuzugreifen, falls konfigurierte.) Um zu sehen , die ‚hallo‘ in der grafischen Umgebung, können Sie die Aufgabe gestellt , könnten als: * * * * * export DISPLAY=:0; xmessage 'hi'.
Manatwork
@manatwork Möglicherweise benötigen Sie auch XAUTHORITY, was möglicherweise nicht einfach ist .
Derobert
7

Es gibt zwei Möglichkeiten, die eigenen zu bearbeiten crontab:

  1. interaktiv, mit crontab -e, die crontabin dem von $VISUALoder $EDITOR, oder angegebenen Editor öffnen

  2. Nicht-interaktiv, mit crontab crontab.txt, die einfach die importieren crontabEinträge aus der Datei crontab.txt, ersetzt die bestehende aktive crontab für den aktuellen Benutzer.

Das Problem, das Sie haben, ist, dass Sie einfach den crontabfalschen Befehl verwenden.


Das Folgende betrifft nicht interaktive Crontab-Manipulationen:

Um bestimmte Aufgaben programmgesteuert zu entfernen , können Sie beispielsweise Folgendes tun

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

Wo PATTERNist ein regulärer Ausdruck, der zu den Aufgaben passt, die Sie entfernen möchten? Hier crontab -lgeben Sie Ihre aktuelle crontab.

Wenn Sie Einträge in einer Datei mit dem Namen haben crontab-fragment.txt, die Sie aus der aktiven Crontab entfernen möchten,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Dies liest die aktuelle crontab und filtert (entfernt) alle Zeilen, die auch in der Datei crontab-fragment.txtim aktuellen Verzeichnis vorkommen (unter Verwendung eines vollständigen Zeilenfolgenvergleichs). Das Ergebnis wird gespeichert crontab.txtund von dort geladen, um die aktuelle Crontab zu ersetzen.

Um fügen Sie eine oder mehrere Aufgabe , so etwas wie

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Dies setzt voraus, dass die Datei crontab-fragment.txtdie Einträge enthält, die Sie hinzufügen möchten. Es liest die aktuelle Crontab, hängt die Einträge crontab-fragment.txtan diese an und erstellt sie crontab.txt. Die crontab.txtDatei ersetzt dann die aktuelle crontab.

Kusalananda
quelle
2

Wenn Sie die crontab interaktiv ändern möchten, führen Sie den Befehl crontab -eohne andere Option aus. Dadurch wird ein Editor für eine Kopie der Crontab gestartet. Wenn Sie den Editor verlassen , wird die bearbeitete Kopie zur neuen Crontab. Sie können über die Umgebungsvariablen VISUALundEDITOR steuern, welcher Editor gestartet wird . Führen Sie den folgenden Befehl aus, um Ihre Crontab aufzulisten crontab -l.

Wenn Sie die crontab in einem Skript ändern möchten, legen Sie VISUALund EDITORden Pfad zu einem Skript oder einem Shell-Snippet fest, mit dem die angegebene Datei geändert wird. Der Editor edist hier eine Möglichkeit, oder sed -iwenn Ihre Implementierung seddiese Option hat. Wenn Sie bedingungslos eine Zeile hinzufügen möchten, können Sie verwenden echo … >>. Achten Sie beim Zitieren darauf; Wenn Sie sich nicht sicher sind, schreiben Sie ein Skript und übergeben Sie den Namen des Skripts als EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF
Gilles 'SO - hör auf böse zu sein'
quelle
2

Dies ist ein bisschen spät, aber für andere, die hier suchen. Es gibt einfachere Möglichkeiten, als die Eingabe- / Ausgabestreams mit VISUALund zu bearbeiten EDITOR.

Sie können einfach Ihren Cron-Zeitplan in eine Datei schreiben, 1 Job pro Zeile, und den Befehl verwenden, crontab [filename]damit Sie catIhre Jobs filenameals Teil Ihres Skripts einlesen können. Rufen Sie am Ende schließlich crontab auf, wenn Sie möchten.

In der Tat ist dies die häufigste Verwendung als man crontabHinweis, indem Sie es zuerst auflisten

Lindsay Ryan
quelle
2

Wenn Sie Einträge crontabdurch Automatisierung oder über die Befehlszeile hinzufügen möchten , können Sie dies tun (Festlegen der gewünschten Zeiten).

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Dann:

service crond reload

die crontabs nachladen.

Chris Sprucefield
quelle
Das ist nicht tragbar; Nicht alle Unix-Systeme speichern die crontab-Dateien unter /var/spool/cron. Ein besserer Weg wäre durch den crontab(1)Befehl.
Thrig
Das mag wahr sein, aber es war das Prinzip der zeigen , wie Sie können es auf einem System tun, und ja, crontab funktioniert der Trick , wenn Sie Zeile für Zeile hinzufügen möchten. Es sollte keine absolute Antwort sein, aber eine, wenn Sie wissen, wo sich Ihre Sachen befinden und Sie massenweise hinzufügen müssen. Nimm es für das, was es ist.
Chris Sprucefield
1

Versuchen Sie es mit diesem Befehl:

crontab -e 

Dann fügen Sie Ihren Cron Job hinzu:

*/1 * * * * echo "hi"

in dieser Datei.

user158204
quelle
0

Ich möchte die Art und Weise hervorheben, wie ich sie im Folgenden beschreibe, obwohl dies bereits in einem anderen Kommentar erwähnt wurde. Ich fand es äußerst nützlich, wenn ich Einträge zu einer Datei hinzufügte und die Datei dann zu crontab hinzufügte. Diese Datei würde die beiden folgenden Einträge enthalten und der Dateiname wäre hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Dann habe ich den folgenden Befehl ausgeführt, um diese Einträge zur crontab hinzuzufügen.

  • $ crontab hello-world-crontab.txt

Im nächsten Schritt müssen Sie überprüfen, ob diese Einträge hinzugefügt wurden.

  • $ crontab -l

Eine kurze Erklärung, was jeder Eintrag bewirkt:

  • Dieser crontab Eintrag schreibt "Hallo Welt!" /home/user/greeting.txtjeden Tag um 9 Uhr in die Akte .
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Diese crontab führt eine Python-Datei aus, die in der Befehlszeile 'Hallo Welt!' jeden Tag um 9 Uhr.
    • 0 09 * * * python /home/user/greeting.py
SylvesterAbreu
quelle