Wie schreibe ich einen Cron, der jeden Tag um Mitternacht ein Skript ausführt?

144

Ich habe gehört, Crontab ist eine gute Wahl, aber wie schreibe ich die Zeile und wo stelle ich sie auf den Server?

Matt Elhotiby
quelle

Antworten:

261

Hier ist ein gutes Tutorial darüber, was Crontab ist und wie man es unter Ubuntu verwendet. Ihre Crontab-Linie sieht ungefähr so ​​aus:

00 00 * * * ruby path/to/your/script.rb

( 00 00Zeigt Mitternacht an - 0 Minuten und 0 Stunden - und das *s bedeutet jeden Tag eines jeden Monats.)

Syntax: 
  mm hh dd mt wd Befehl

  mm Minute 0-59
  hh Stunde 0-23
  dd Tag des Monats 1-31
  mt Monat 1-12
  wd Wochentag 0-7 (Sonntag = 0 oder 7)
  Befehl: Was möchten Sie ausführen?
  Alle numerischen Werte können durch * ersetzt werden, was alle bedeutet
Jordan läuft
quelle
1
Verpassen Sie nicht die Spalte "Als Benutzer ausführen"?
Lucas Cimon
4
@LucasCimon Die Benutzerspalte (die vor dem Befehl stehen würde) ist in /etc/crontab(unter Ubuntu) zulässig , aber wenn Sie ausführen crontab -e, bearbeiten Sie eine benutzerspezifische Crontab, die diese Spalte nicht zulässt. IIRC Ubuntu rät vom /etc/crontabmanuellen Beenden ab, da es möglicherweise überschrieben wird. Siehe hier: stackoverflow.com/questions/8475694/…
Jordan Running
@ Jordan so die Antwort auf crontab für Wurzel istsudo crotab -u root -e
schneidig
40

von der Manpage

linux$ man -S 5 crontab

   cron(8) examines cron entries once every minute.

   The time and date fields are:

          field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sun, or use names)
   ...
   # run five minutes after midnight, every day
   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
   ...

Es ist gut zu beachten, dass spezielle "Spitznamen" verwendet werden können (dokumentiert in der Manpage), insbesondere "@reboot", für das es keine Alternative zu Uhrzeit und Datum gibt.

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh

Sie können diesen Trick auch verwenden, um Ihren Cron-Job mehrmals pro Minute auszuführen.

   # Run every minute at 0, 20, and 40 second intervals
   * * * * *       sleep 00; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 20; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 40; /usr/local/sbin/run_3times_per_minute.sh

Um einen Cron-Job hinzuzufügen, können Sie eines von drei Dingen ausführen:

  1. Fügen Sie der Crontab eines Benutzers einen Befehl hinzu, wie oben gezeigt (und über die Crontab, Abschnitt 5, Manpage).

    • Bearbeiten Sie die Crontab eines Benutzers als Root mit crontab -e -u <username>
    • oder bearbeiten Sie die crontab des aktuellen Benutzers mit just crontab -e
    • Sie können den Editor mit der EDITORUmgebungsvariablen festlegen
      • env EDITOR=nano crontab -e -u <username>
      • oder legen Sie den Wert von EDITOR für Ihre gesamte Shell-Sitzung fest
        1. export EDITOR=vim
        2. crontab -e
    • Machen Sie Skripte mit ausführbar chmod a+x <file>


  1. Erstellen Sie ein Skript / Programm als Cron-Job und fügen Sie es den Anacron- /etc/cron.*lyVerzeichnissen des Systems hinzu

    • anacron /etc/cron.*ly Verzeichnisse:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • wie in:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - mach es ausführbar
    • Siehe auch die Anacron-Manpage: man anacron
    • Machen Sie Skripte mit ausführbar chmod a+x <file>
    • Wann werden diese Cron. * Ly-Skripte ausgeführt?
      • Für RHEL / CentOS 5.x, werden sie in so konfigurieren /etc/crontaboder /etc/anacrontabzu einem festgelegten Zeitpunkt ausgeführt
      • RHEL / CentOS 6.x + und Fedora 17+ Linux-Systeme definieren dies nur in /etc/anacrontabund cron.hourly in/etc/cron.d/0hourly


  1. Oder Sie können System-Crontables in erstellen /etc/cron.d.

    • Die zuvor beschriebene Crontab-Syntax (mit der zusätzlichen Bereitstellung eines Benutzers zum Ausführen jedes Jobs als) wird in eine Datei eingefügt und in das Verzeichnis /etc/cron.d verschoben.
    • Diese sind in Systempaketen (z. B. RPM-Paketen) einfach zu verwalten und können daher normalerweise anwendungsspezifisch sein.
    • Der Syntaxunterschied besteht darin, dass ein Benutzer für den Cron-Job nach den Zeit- / Datumsfeldern und vor dem auszuführenden Befehl angegeben werden muss.
    • Die hinzugefügten Dateien /etc/cron.dmüssen nicht ausführbar sein.
    • Hier ist ein Beispieljob, der als Benutzer ausgeführt someuserwird und dessen Verwendung /bin/bashals Shell erzwungen wird.


   File: /etc/cron.d/myapp-cron
   # use /bin/bash to run commands, no matter what /etc/passwd says
   SHELL=/bin/bash
   # Execute a nightly (11:00pm) cron job to scrub application records
   00 23 * * * someuser /opt/myapp/bin/scrubrecords.php
Russell E Glaue
quelle
5

Manchmal müssen Sie PATH und GEM_PATH mit crontab mit rvm angeben.

So was:

# top of crontab file
PATH=/home/user_name/.rvm/gems/ruby-2.2.0/bin:/home/user_name/.rvm/gems/ruby-2.2.0@global/bin:/home/user_name/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/user_name/.rvm/gems/ruby-2.2.0:/home/user_name/.rvm/gems/ruby-2.2.0@global

# jobs
00 00 * * * ruby path/to/your/script.rb
00 */4 * * * ruby path/to/your/script2.rb
00 8,12,22 * * * ruby path/to/your/script3.rb
LV2014
quelle
4

Kurzanleitung zum Einrichten eines Cron-Jobs

Erstellen Sie eine neue Textdatei, Beispiel: mycronjobs.txt

Speichern Sie für jeden täglichen Job (00:00, 03:45) die Einteilungen in mycronjobs.txt

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh

Senden Sie die Jobs an cron (jedes Mal, wenn Sie dies ausführen, löscht cron die gespeicherten Daten und aktualisiert sie mit den neuen Informationen in mycronjobs.txt )

crontab mycronjobs.txt

Zusätzliche nützliche Informationen

Aktuelle Cron-Jobs anzeigen

crontab -l

Entfernen Sie alle Cron-Jobs

crontab -r
Dyltini
quelle
Ihre Crontab-Syntax ist für 03:45 falsch. Die Crontab-Felder sind Minute dann Stunde, dh "45 03" - Sie haben es rückwärts in Ihrem Beitrag.
Russell E Glaue
1

Sie können das Shell-Skript auf zwei Arten ausführen, entweder mithilfe eines Cron-Jobs oder durch Schreiben eines Shell-Skripts

Nehmen wir an, Ihr Skriptname lautet "yourscript.sh".

Überprüfen Sie zuerst die Benutzerberechtigung des Skripts. Verwenden Sie den folgenden Befehl, um die Benutzerberechtigung des Skripts zu überprüfen

ll script.sh

Wenn sich das Skript im Stammverzeichnis befindet, verwenden Sie den folgenden Befehl

sudo crontab -e

Zweitens, wenn das Skript den Benutzer "ubuntu" enthält, verwenden Sie den folgenden Befehl

crontab -e

Fügen Sie die folgende Zeile in Ihre Crontab ein: -

55 23 * * * /path/to/yourscript.sh

Eine andere Möglichkeit besteht darin, ein Skript zu schreiben und es im Hintergrund auszuführen

Hier ist das Skript, in das Sie Ihren Skriptnamen eingeben müssen (z. B.: - youscript.sh), das jeden Tag um 23:55 Uhr ausgeführt wird

#!/bin/bash while true do /home/modassir/yourscript.sh sleep 1d done

Speichern Sie es in einer Datei (nennen wir es "every-day.sh")

Schlaf 1d - bedeutet, dass es einen Tag wartet und dann wieder läuft.

Geben Sie jetzt die Erlaubnis für Ihr Skript. Verwenden Sie den folgenden Befehl: -

chmod + x every-day.sh

Führen Sie dieses Shell-Skript jetzt im Hintergrund mit "nohup" aus. Dadurch wird das Skript auch nach dem Abmelden von Ihrer Sitzung weiter ausgeführt.

Verwenden Sie den folgenden Befehl, um das Skript auszuführen.

nohup ./every-day.sh &

Hinweis: - Um "yourscript.sh" jeden Tag um 23:55 Uhr auszuführen, müssen Sie das Skript "every-day.sh" genau um 23:55 Uhr ausführen.

Modassir Haider
quelle
0

Fügen Sie diesen Satz in eine Crontab-Datei ein: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

MAES
quelle