Jeden Tag einen Cronjob mit verschiedenen Parametern ausführen

12

Ich bin ein Programmierer und weiß nicht viel über crons, aber ich möchte wissen, ob dies möglich ist.

Nehmen wir an, ich habe ein Array [option1, option2, option3]und ein Skript, das ich in NodeJS aufgerufen habe script.js. Ich möchte dieses Skript jeden Tag um 1 Uhr morgens ausführen. Der cronBefehl hierfür wäre:

0 1 * * * node ~/script.js

Nun, jetzt der schwierige Teil, ich möchte die Optionen jeden Tag wechseln, also möchte ich zum Beispiel Montag node ~/script.js option1, den nächsten Tag node ~/script.js option2und so weiter laufen . Außerdem möchte ich in der Lage sein, Optionen bei Bedarf hinzuzufügen / zu entfernen, aber die Drehung sollte intakt bleiben.

Ist das in irgendeiner Weise möglich? Ich weiß, dass ich dies auch innerhalb des Knotens tun kann, aber ich möchte dies lieber außerhalb des Skripts tun und das Skript so lassen, wie es ist.

Saif Bechan
quelle
2
Ich würde empfehlen, dieses Skript zu schreiben, anstatt zu versuchen, cron dazu zu bringen, es selbst zu tun.
EarthMelon

Antworten:

15

Außerdem möchte ich in der Lage sein, Optionen bei Bedarf hinzuzufügen / zu entfernen, aber die Drehung sollte intakt bleiben.

Das ist knifflig. Was bedeutet es, dass die Rotation nach der Änderung der Optionsliste intakt bleibt? Schließlich könnten Sie die Liste komplett neu erstellen und alle Hinweise darauf zerstören, wo Sie sich befanden.

Was Sie wahrscheinlich tun könnten, ist ein Verzeichnis mit Dateien einzurichten, die Ihre Optionen darstellen (entweder über ihren Dateinamen oder ihren Inhalt). Wenn der Cron-Job ausgeführt wird, listen Sie dieses Verzeichnis auf und sortieren die Dateien nach dem Zeitpunkt der letzten Änderung. Sie nehmen den ältesten Eintrag, touchdiese Datei, um ihre Änderungszeit auf die aktuelle Zeit zu ändern, und verwenden ihn dann zum Ausführen des Skripts.

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

Wenn Sie möchten, können Sie dies auch für cron in eine einzelne Zeile schreiben, obwohl das Lesen schwieriger wird.

Das Hinzufügen von Optionen bedeutet, dass dem Optionsverzeichnis neue Dateien hinzugefügt werden. Das Entfernen von Optionen bedeutet das Löschen von Dateien. Zu jedem Zeitpunkt ist die älteste Datei diejenige, die als nächstes ausgeführt wird. Daher werden ganz am Ende des Zyklus neue Optionen hinzugefügt, als ob die Datei gerade ausgeführt worden wäre. Wenn Sie Optionen neu bestellen möchten, können Sie sie in einer beliebigen Reihenfolge berühren.

MvG
quelle
Absolut +1 für die Art und Weise, wie Sie die Reihenfolge der Optionen in "Listenänderungen" verwalten.
Hagen von Eitzen
Danke für die Antwort, ich mag es und werde es benutzen. Die genaue Reihenfolge der Rotation ist nicht so wichtig, wenn ich der Liste neue hinzufüge. Das Einzige, was zählt, ist, dass sie alle jede Woche 1-2 Runs bekommen und nicht zwei am selben Tag.
Saif Bechan
2
$(ls -rt | head -n1)wird natürlich bei Dateinamen, die Zeilenumbrüche enthalten, kaputt gehen, aber zu diesem Zweck können Sie wahrscheinlich mit "Mach das nicht" davonkommen.
CJM
20

Angenommen, Sie möchten für jeden Wochentag eine andere Option. Du kannst:

  1. Habe einen separaten Cron Job für diese:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    etc...

  2. Stellen Sie bashdie gewünschten Optionen für Sie bereit:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (Letzteres habe ich nicht ausgeführt, daher ist möglicherweise eine Feinabstimmung erforderlich - aber das ist die allgemeine Idee.)

Konrad Gajewski
quelle
2
Vielen Dank für die Antworten, aber ich denke, es wird chaotisch. Ich muss wirklich irgendwo ein Array definieren, sonst funktioniert es nicht. Ich kann nicht mit echo option1usw. arbeiten, da meine Optionen von Woche zu Woche variieren können. Ich mache das einfach in meiner Node-App und verfolge, welche ich zuletzt in meiner Datenbank ausgeführt habe.
Saif Bechan
13

Nein, ich kann mir keinen sauberen Weg vorstellen, dies zu tun. Schreiben Sie einfach ein einfaches Shell-Wrapper-Skript, das das Datum überprüft und Ihre Knotenanwendung täglich mit den erforderlichen Optionen startet.

EEAA
quelle
+1 der Schlüssel ist "kein sauberer Weg".
Paolo