Explicación del cron jobs y cron groups

Los cron jobs se configuran en el fichero etc/crontab.xml. Cada job pertenece a un grupo de jobs y a cada job le tenemos que espeficiar el intervalo de tiempo que tiene que pasar para que se ejecute. Este grupo se define en el fichero etc/cron_groups.xml. Agrupamos los jobs por grupo porque tienen unas características que son comúnes. Se pueden definir en el fichero cron_groups.xml O en el backoffice de Magento. Configuration > advanced > system > cron

    
        <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>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>4320</history_failure_lifetime>
                <use_separate_process>0</use_separate_process>
            </group>
        </config>        
    

En el crontab del Linux se tiene que definir lo siguiente:

        #~ MAGENTO START 7ac6553f09dae8ef212e98e86fb0928f92d69984d86c9750b608c5409d0e9553
        * * * * * /usr/bin/php7.4 /var/www/html/magento/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/magento/var/log/magento.cron.log
        #~ MAGENTO END 7ac6553f09dae8ef212e98e86fb0928f92d69984d86c9750b608c5409d0e9553
    
Esto es que el servicio cron , cada minuto , se va a ejecutar el comando bin/magento cron:run. Este comando lo que hace es añadir cada job de los ficheros crontab.xml en la tabla cron_schedule según las configuraciones de cada grupo de crones al que pertenece el cron job. Por ejemplo, si el cron job pertenece al grupo default, se recogerán los cron jobs cada 15 minutos por defecto. En esta tabla se concreta la fecha y hora para ejecutar el job. Luego se elimina. Entonces esta tabla sirve para encolar jobs.
    +--------------+--------------+------+-----+-------------------+-------------------+
    | Field        | Type         | Null | Key | Default           | Extra             |
    +--------------+--------------+------+-----+-------------------+-------------------+
    | schedule_id  | int unsigned | NO   | PRI |             | auto_increment    |
    | job_code     | varchar(255) | NO   | MUL | 0                 |                   |
    | status       | varchar(7)   | NO   |     | pending           |                   |
    | messages     | text         | YES  |     |             |                   |
    | created_at   | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
    | scheduled_at | timestamp    | YES  |     |             |                   |
    | executed_at  | timestamp    | YES  |     |             |                   |
    | finished_at  | timestamp    | YES  |     |             |                   |
    +--------------+--------------+------+-----+-------------------+-------------------+
    
El campo messages sirve para registrar por ej errores en la ejecución del cron.

Generar el tiempo del cron de forma dinámica en el backoffice

Podemos crear un configurable en el backoffice y luego tomar el valor del config_core_data mediante el config_path dentro de la etiqueta job.

    
        <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="catalog_product_alert" instance="Magento\ProductAlert\Model\Observer" method="process">
                    <config_path>crontab/default/jobs/catalog_product_alert/schedule/cron_expr</config_path>
                </job>
            </group>
        </config>
        
    

Estados del cron job

Estados del cron de Magento. El estado missed quiere decir si no se ejecuta el cron job encolado dentro de x minutos, se queda descartada. Si hay algún error durante la ejecución, se pone el mensaje del error en el campo messages. Si todo ha ido bien, se cambia al estado "success".

Referencias