Magento2: Führen Sie jede Minute einen Cron-Job aus

7

System Cron startet jede Minute Magento 2 Cron:

$ crontab -l
*/1 * * * * /usr/bin/php /home/user/prj/mage2/bin/magento cron:run >> /home/user/prj/mage2/var/log/cron.log

Ich sehe, dass Ran jobs by schedule.jede Minute eine neue Zeile in das Protokoll eingefügt wird.

Dies sind meine Einstellungen für meine Aufgabe:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
    <group id="default">
        <job name="my_own" instance="\Vendor\Module\Cron\Task" method="execute">
            <schedule>...</schedule>
        </job>
    </group>
</config>

Diese Einstellungen führen meinen Job tatsächlich alle 15 Minuten aus (meine eigene Nachricht wird alle 15 Minuten zum Protokoll hinzugefügt):

<schedule>* * * * *</schedule>
<schedule>*/1 * * * *</schedule>

Das ist mein Log:

...
Ran jobs by schedule.
Ran jobs by schedule.
Ran jobs by schedule.
My own job is started.
Ran jobs by schedule.
...

Dies sind Magento 2 Cron-Einstellungen: Magento 2 Cron Einstellungen

Wie kann ich festlegen <schedule>, dass meine Aufgabe alle 1 Minute ausgeführt wird?

Alex Gusev
quelle
Dies sollte gut funktionieren<schedule>* * * * *</schedule>
Ankit Shah
Tatsächlich <schedule>* * * * *</schedule>läuft meine Aufgabe alle 15 Minuten :(
Alex Gusev
Auf Ihrem Server stimmt etwas nicht. Es sollte global als 1 Minute funktionieren.
Ankit Shah
Ja, es ist :( System cron (Linux) startet jede Minute und startet Magento 2 cron jede Minute, aber Magento cron startet meine eigene Aufgabe nur einmal in 15 Minuten für <schedule>* * * * *</schedule>Wahrscheinlich gibt es dann einige Magento 2-Konfigurationseinstellungen, die Startaufgaben mehr verhindern einmal in 15 min?
Alex Gusev
Check in cron_scheduleTabelle
Ankit Shah

Antworten:

8

Es gibt 2 Gruppen in Magento 2 Cron: index& default. Aufgaben / Jobs, die in indexGruppen zusammengefasst werden, beginnen alle 1 Minute (Standardeinstellung):

<group id="index">
    <job name="..." instance="..." method="...">
        <schedule>* * * * *</schedule>
    </job>
</group>

Aufgaben / Jobs, die in defaultGruppen zusammengefasst werden, werden alle 15 Minuten gestartet (Standardeinstellung):

<group id="default">
    <job name="..." instance="..." method="...">
        <schedule>* * * * *</schedule>
    </job>
</group>
Alex Gusev
quelle
Gibt es Konfigurationseinstellungen für diese?
mjdevloper
Speicher / Konfiguration / Erweitert / System / Cron (Geplante Aufgaben) / Cron-Konfigurationsoptionen für die Gruppe: [Index | Standard]
Alex Gusev
Ich habe Setup-Gruppen-ID-Index für jede Minute und bereits cron ausführen: Befehl ausführen, aber es funktioniert nicht für mich
Sarvesh Tiwari
6

Es scheint, dass Cron-Jobs in Magento 2 durch ihre Einstellungen begrenzt sind, die in der Cron-Gruppe definiert sind, zu der sie gehören. Ich bin mir nicht sicher, ob dies ein Fehler oder eine Funktion ist.

Alex Gusev weist bereits in seiner Antwort darauf hin , aber um es etwas näher zu erläutern: In Magento 2 gibt es standardmäßig 2 Cron-Gruppen: defaultund index. Diese sind in Magento_Indexer/etc/cron_groups.xmlund definiert Magento_Cron/etc/cron_groups.xml. Zum Beispiel:

<group id="default">
    <schedule_generate_every>15</schedule_generate_every>
    <schedule_ahead_for>20</schedule_ahead_for>
    <schedule_lifetime>15</schedule_lifetime>
    <history_cleanup_every>10</history_cleanup_every>
    <history_success_lifetime>60</history_success_lifetime>
    <history_failure_lifetime>600</history_failure_lifetime>
    <use_separate_process>0</use_separate_process>
</group>

Diese Cron-Gruppe bestimmt die Standard- / globalen Werte für jeden Cron-Job. Ich bin mir nicht sicher, wie es funktioniert, aber nach meinen eigenen Tests kann man einen Cron nicht so einstellen, dass er öfter pro Stunde läuft als in der schedule_generate_everyEinstellung festgelegt. Wenn Sie zum Beispiel so etwas haben:

<group id="default">
    <job name="custom_module" instance="Custom\Module\Cron\DoSomething" method="execute">
        <schedule>*/1 * * * *</schedule>
    </job>
</group>

Obwohl Sie vielleicht erwarten, dass dieser Cronjob jede Minute geplant wird , beschränken ihn die globalen Einstellungen auf einen Mindestzeitraum von 15 Minuten .

Um dies zu lösen, können Sie entweder:

  • Bearbeiten Sie die Einstellung in der Systemkonfiguration (Erweitert → System → Cron) oder:
  • Überschreiben Sie den globalen Standard in Ihrem Modul, indem Sie eine eigene cron_groups.xmlDatei hinzufügen (vorausgesetzt, der Client hat noch nicht an den Konfigurationseinstellungen herumgebastelt):

Beispieldatei config_groups.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"            xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/cron_groups.xsd">
    <group id="default">
        <schedule_generate_every>1</schedule_generate_every>
    </group>
</config>

Fehler? Merkmal? Irreführende Konfigurationseinstellung? Ich bin mir nicht sicher, wie ich das nennen soll. Sie könnten argumentieren, dass es gut ist, dass Sie einen globalen Bereich haben, der mehr als 100 Module einschränken kann, um zu versuchen, jede Minute einen Cron auszuführen. Auf der anderen Seite: Wenn ich ein Entwickler bin, der weiß, was er tut, kann es gute Gründe geben, jede Minute zu laufen.

Wenn das Ausführen jeder Minute obligatorisch ist, kann es auch sinnvoll sein, eine ganz neue Cron-Gruppe für Ihre Konfiguration hinzuzufügen (verschmutzen Sie die index-cron-Gruppe nicht mit nicht indizierenden Cron-Jobs). Aber das ist eine Frage der Architektur und das überlasse ich Ihnen.

Giel Berkers
quelle
Ich denke nicht, dass das richtig ist. Das schedule_generate_everyweist Magento an, den Zeitplan für diese Cron-Gruppe alle 15 Minuten zu aktualisieren. Wenn Sie einen Job festlegen, der jede Minute in dieser Gruppe ausgeführt wird, generiert Magento 15 cron_scheduleEinträge für diesen Job, einen für jede Minute.
JamesHalsall
Ich würde das auch erwarten, aber das sind die Ergebnisse, die ich damals beobachtet habe. Ich bin mir nicht mal mehr sicher, um welche Magento-Version es sich handelt. 2,0? 2.1? Die Ergebnisse können in der Zwischenzeit abweichen. Ich habe mich auch gefragt, ob dies ein Fehler oder eine Funktion ist.
Giel Berkers
3

Um einmal pro Minute zu planen, müssen Sie geben

* * * * *

Von links nach rechts steht der 1. Stern für die Minute (Bereich: 0-59). Der 2. Stern steht für die Stunde (Bereich: 0-23). ​​Der 3. Stern steht für den Tag des Monats (Bereich: 1-31). Der 4. Stern steht für den Monat des Jahres (Bereich: 1-). 12) 5. steht für Wochentag (Bereich: 1-7, 1 steht für Montag)

Informationen zum Cron-Timing finden Sie unter dem Link: http://www.nncron.ru/help/EN/working/cron-format.htm

Referenzlink zum Festlegen des benutzerdefinierten Cron: http://www.dckap.com/blog/how-to-set-and-configure-custom-cron-jobs-in-magento-2/

Kavitha Mano
quelle
2

Aus Ihrer Frage geht nicht hervor, welchen Zeitplan Sie möchten. Hier sind also beide:

Alle 1 Minute:

* * * * *

Alle 15 Minuten:

*/15 * * * *

Dieses Tool kann zum Erstellen / Debuggen von Cron-Zeitplänen hilfreich sein: https://crontab.guru/

Danny Nimmo
quelle
Ich habe meiner Aufgabe eine "Echo" -Anweisung hinzugefügt und alle 15 Minuten wird eine Echo-Nachricht für den Zeitplan "* * * * *" angezeigt. Tatsächlich führt diese Einstellung meine Aufgabe alle 15 Minuten aus, nicht jede Minute.
Alex Gusev
Überprüfen Sie Ihre Konfiguration unter Stores> Configuration> Advanced> System> Cron (Scheduled Tasks). Stellen Sie sicher, dass die Zeitplaneinstellungen für Ihr Setup in Ordnung sind.
Danny Nimmo
Alle Einstellungen bleiben unverändert (standardmäßig festgelegt).
Alex Gusev
Hallo Danny Nimmo, es funktioniert, wenn ich cron: run command starte. Das ist gemein jedes Mal, wenn ich cron: run Befehl ausführen als es funktioniert
Sarvesh Tiwari
0

Bitte versuche

* / 1 * * * * *

zum Planen von Cron in jeder Minute. Sie können Ihre Cron-Einträge in der Tabelle cron_schedule überprüfen, um die von Magento vorgenommenen Planungseinträge anzuzeigen.

Aditya Yadav
quelle