Frage

Ich möchte in der Lage sein, einen neuen Cron -Job programmatisch hinzuzufügen. Was ist der beste Weg, dies zu tun?

Aus meine Forschung, Es scheint, dass ich den aktuellen Crontab fallen lassen und dann einen neuen anhängen, um das wieder in Crontab zu bringen:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Es hat immer gut für mich funktioniert.

Sie sollten ein etwas anspruchsvolleres Skript in Betracht ziehen, das drei Dinge tun kann.

  1. Eine Crontab -Linie anhängen; versichern, dass es nicht existierte. Hinzufügen, wenn es bereits existiert, ist schlecht.

  2. Entfernen Sie die Crontab -Linie. Vielleicht nur Warnung, wenn es nicht existierte.

  3. Eine Kombination der beiden oben genannten Merkmale, um die Crontab -Linie zu ersetzen.

Andere Tipps

Der beste Weg, wenn Sie als Root ausführen, besteht darin, eine Datei in /etc/cron.d fallen zu lassen

Wenn Sie einen Paketmanager verwenden, um Ihre Software zu verpacken, können Sie einfach Dateien in diesem Verzeichnis ablegen und sie werden so interpretiert, als wären sie Crontabs, jedoch mit einem zusätzlichen Feld für den Benutzernamen, z. B.:

Dateiname: /etc/cron.d/per_minute

Inhalt:* * * * * root /bin/sh /home/root/script.sh

Die Lösung von OP hat einen Fehler. Sie kann möglicherweise zweimal hinzugefügt werden. Im Folgenden werden Sie festgestellt.

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -

Cron etwas hinzufügen

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -

Um dies aus Cron zu entfernen

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh |  sort | uniq | crontab -

Hoffnung würde jemandem helfen

Wenn Sie vorhaben, es für ein Run-Once-Szenario für nur etwas zu tun, schauen Sie sich an 'bei'

Ändern Sie einfach den Editor in TEE -Befehl:

export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e

Unter der Annahme, dass es bereits einen Eintrag in Ihrem Crontab gibt, sollte der folgende Befehl relativ gut funktionieren. Notiere dass der $CMD Variable ist nur zur Lesbarkeit vorhanden. Das Sortieren vor dem Filtern von Duplikaten ist wichtig, weil uniq funktioniert nur an angrenzenden Linien.

CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -

Wenn Sie derzeit einen leeren Crontab haben, erhalten Sie den folgenden Fehler an STDERR:

no crontab for user

Wenn Sie dies vermeiden möchten, können Sie ein wenig Komplexität hinzufügen, um so etwas zu tun:

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//"  | sort | uniq | crontab -

Mann Crontab ist auch nützlich:

Crontab (1)

NAME

   crontab - manipulate per-user crontabs (Dillon's Cron)

ZUSAMMENFASSUNG

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user

Zu Johnz 'Antwort ist hier die Syntax als Root, wenn Sie ein Sudoer sind:

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -

Die meisten Lösungen hier sind zum Hinzufügen von Zeilen zum Crontab. Wenn Sie mehr Kontrolle benötigen, möchten Sie den gesamten Inhalt des Crontab steuern können.

Sie können Rohrleitungen verwenden, um dies ziemlich elegant zu tun.

Um das Crontab vollständig neu zu schreiben, tun Sie dies

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

Dies sollte leicht mit anderen hier beschriebenen Antworten zu kombinieren sein wie wie

crontab -l | <something> | tee |crontab -

Oder wenn Sie den Inhalt in einer Datei haben, ist er noch einfacher

cat <file> |crontab -
function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }
    return $cronjob_exists;
}

function append_cronjob($command){

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){

        //add job to crontab
        exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);


    }

    return $output;
}

    append_cronjob('* * * * * curl -s http://localhost/cron/test.php');

Dies würde überprüfen, ob Ihr Befehl noch nicht vor dem Hinzufügen vorhanden ist.

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

Prost.

Stdout in crontab Ich habe das neue Crontab für mich nicht auf macos installiert, daher fand ich diese Lösung stattdessen mit dem tee Herausgeber in einer Sub -Shell:

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)

Sie können Ihre Aufgaben auch zu /etc/cron.*/ hinzufügen

Hier ist ein weiterer One-Liner-Weg, der Duplikate vermeidet

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

Und hier ist eine Möglichkeit, Johnz 'Antwort zu tun und zu vermeiden no crontab for user Nachricht oder wenn Sie in a arbeiten müssen set -eu Geben Sie die Umgebung ein und kann nichts zurückgeben (in diesem Fall der Fall 2>/dev/null Teil ist optional):

( (crontab -l 2>/dev/null || echo "")  ; echo "0 * * * * your_command") | sort -u - | crontab -

Oder wenn Sie Dinge aufteilen möchten, damit sie lesbarer sind:

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -

Oder entfernen Sie optional irgendwelche Verweise auf Ihr_Command (Beispiel: Wenn sich der Zeitplan geändert hat, möchten Sie nur, dass er jemals einmal cron'ed). In diesem Fall brauchen wir nicht mehr uniq (Zusätzlicher Bonus, Insertionsauftrag ist ebenfalls erhalten):

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -

Sie können die Textdatei der Cron -Tabelle auch direkt bearbeiten, Ihre Lösung scheint jedoch perfekt akzeptabel zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top