Ecom house logo

Cron w Magento 2 - konfiguracja i diagnostyka

Opublikowano: 17 lipca 2026

Cron Magento to silnik napędowy sklepu - bez niego nie działają indeksery w trybie schedule, nie wysyłają się maile, nie czyści się queue, nie aktualizują kursy walut, nie wysyłają reminderzy zamówień. Ten poradnik pokazuje, jak skonfigurować cron i jak diagnozować jego problemy.

Krytyczne dla działania sklepu: Sklep Magento bez działającego crona powoli przestaje działać:

  • Indeksery w trybie schedule nigdy się nie odpalają → koszyk pokazuje stare ceny.
  • Newsletter w kolejce nigdy nie wysyła się do klientów.
  • Aktualizacja kursów walut nie działa.
  • Sitemap.xml nie generuje się.
  • Czyszczenie logów / sesji / tymczasowych plików nie działa.

Cron musi działać 24/7 od pierwszego dnia produkcji.

Jak działa cron Magento

Magento ma wewnętrzny scheduler (cron_schedule tabela), który przechowuje zaplanowane zadania. System operacyjny (Linux cron) co minutę odpala komendę bin/magento cron:run, która:

  1. Sprawdza tabelę cron_schedule - jakie zadania są zaplanowane.
  2. Wykonuje te, których czas nastał.
  3. Aktualizuje status (pendingrunningsuccess / failure).
  4. Sprząta stare wpisy.

Magento dzieli cron na trzy grupy uruchamiane niezależnie:

Grupa Co robi Częstotliwość typowa
default Indeksery, generowanie sitemap, czyszczenie sesji, kursy walut. Co minutę
index Indeksery w trybie schedule. Co minutę
consumers Kolejki RabbitMQ / DB (asynchroniczne zadania). Procesy długotrwałe

Krok 1. Skonfiguruj cron Linux

Magento dostarcza komendę do automatycznego dodania wpisów do crontab użytkownika:

cd /var/www/magento
bin/magento cron:install

Komenda doda do crontab -u <user> trzy wpisy:

# ~ MAGENTO START 1f6b50e0e8b22cf...
* * * * * /usr/bin/php /var/www/magento/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/magento/var/log/magento.cron.log
* * * * * /usr/bin/php /var/www/magento/update/cron.php >> /var/www/magento/var/log/update.cron.log
* * * * * /usr/bin/php /var/www/magento/bin/magento setup:cron:run >> /var/www/magento/var/log/setup.cron.log
# ~ MAGENTO END 1f6b50e0e8b22cf...

Użytkownik crona: Cron Magento musi być uruchamiany przez tego samego użytkownika, którego używa serwer web (typowo www-data na Ubuntu, nginx lub apache na innych dystrybucjach). Inaczej pliki tworzone przez cron będą miały złe uprawnienia.

Sprawdź:

ps aux | grep -E 'nginx|apache' | head -1

Komendę cron:install uruchom jako ten użytkownik.

Sprawdzenie konfiguracji

# Zobacz wpisy w crontab
crontab -l

# Sprawdź czy cron daemon działa (Linux)
systemctl status cron     # Ubuntu / Debian
systemctl status crond    # CentOS / RHEL

Usunięcie wpisów (jeśli potrzebne)

bin/magento cron:remove

Krok 2. Skonfiguruj harmonogramy Magento

Ścieżka: Stores > Configuration > Advanced > System > Cron (Scheduled Tasks)

Trzy grupy konfiguracji (default, index, consumers). Dla każdej:

Pole Wartość typowa
Generate Schedules Every (minutes) 15
Schedule Ahead for (minutes) 20
Missed if Not Run Within (minutes) 10
History Cleanup Every (minutes) 10
Success History Lifetime (minutes) 60
Failure History Lifetime (minutes) 600
Use Separate Process Yes (zalecane)

Zapisz Save Config.

Krok 3. Konfiguracja consumerów (kolejki)

Stores > Configuration > Advanced > System > Cron (Scheduled Tasks) > Cron configuration options for group: consumers:

Pole Wartość typowa
Use Separate Process Yes
Generate Schedule Every 1 (minuta)
Schedule Ahead For 4
Missed if Not Run Within 4
History Cleanup Every 10

Consumery na produkcji - supervisor

Na produkcji consumery powinny działać jako stałe procesy, nie jako cron job. To zapobiega lukom w przetwarzaniu kolejek.

Konfiguracja supervisor (/etc/supervisor/conf.d/magento-consumers.conf):

[program:magento-consumers]
command=/usr/bin/php /var/www/magento/bin/magento queue:consumers:start %(process_num)02d
process_name=%(program_name)s_%(process_num)02d
numprocs=5
user=www-data
autorestart=true
startretries=3
stderr_logfile=/var/log/magento-consumers-err.log
stdout_logfile=/var/log/magento-consumers-out.log

Lub dla pojedynczego consumera:

sudo systemctl enable [email protected]

Szczegóły zależą od konkretnej infrastruktury - wymaga konfiguracji od dewelopera / devops.

Krok 4. Weryfikacja działania crona

Test ręczny

bin/magento cron:run

Komenda wykona zaplanowane zadania natychmiast. Jeśli zwraca błąd - patrz Najczęstsze problemy.

Sprawdź wpisy w bazie

SELECT job_code, status, scheduled_at, executed_at, finished_at, messages
FROM cron_schedule
ORDER BY scheduled_at DESC
LIMIT 20;

Powinny być widoczne wpisy z różnymi job_code (indexer_reindex_all_invalid, system_log_clean, sales_send_order_emails...) i statusami success.

Sprawdź logi

tail -f var/log/magento.cron.log
tail -f var/log/cron.log
tail -f var/log/system.log     # czasem cron jobs logują tu

Magento Admin - Cron List

W Magento 2.4+ można sprawdzić cron z poziomu panelu:

System > Tools > Cron Jobs (jeśli zainstalowany moduł admin viewing crons)

Konfiguracja Custom Cron Job

Aby dodać własne zadanie (np. codzienna synchronizacja z ERP), wymaga stworzenia modułu Magento:

<!-- app/code/YourVendor/YourModule/etc/crontab.xml -->
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <group id="default">
        <job name="yourvendor_module_syncerp"
             instance="YourVendor\YourModule\Cron\SyncErp"
             method="execute">
            <schedule>0 3 * * *</schedule>  <!-- codziennie o 3:00 -->
        </job>
    </group>
</config>

Wymaga developera - ten poradnik kończy się na konfiguracji natywnego crona Magento.

Co Magento robi w cronie (przykłady)

Najczęściej działające zadania:

job_code Co robi
indexer_reindex_all_invalid Reindex unieważnionych indekserów (tryb schedule).
sales_send_order_emails Wysyłka opóźnionych maili zamówień.
sales_send_invoice_emails Wysyłka maili faktur.
sales_send_shipment_emails Wysyłka maili wysyłek.
system_log_clean Czyszczenie starych logów.
catalog_product_alert Wysyłka powiadomień o dostępności / zmianie ceny produktów.
newsletter_send_all Wysyłka kolejek newslettera.
currency_rates_update Aktualizacja kursów walut.
captcha_delete_old_attempts Czyszczenie starych prób CAPTCHA.
cleanup_quotes Czyszczenie porzuconych koszyków.
cron_clean_jobs Czyszczenie wpisów cron_schedule.
outdated_authentication_failures_cleanup Czyszczenie historii nieudanych prób logowania.

Najczęstsze problemy

Cron Magento w ogóle nie działa

Sprawdź w kolejności:

  1. Czy cron daemon działa?

    systemctl status cron     # lub crond
    
  2. Czy wpisy są w crontab?

    crontab -l                       # crontab użytkownika
    sudo crontab -l -u www-data      # crontab konkretnego usera
    
  3. Czy są błędy w logach crona?

    tail -100 var/log/magento.cron.log
    tail -100 /var/log/syslog | grep CRON
    
  4. Czy bin/magento cron:run działa ręcznie?

    sudo -u www-data php /var/www/magento/bin/magento cron:run
    
  5. Czy uprawnienia plików są OK?

    ls -la /var/www/magento/var/         # wszystko musi należeć do www-data
    sudo chown -R www-data:www-data /var/www/magento/var
    

Wpisy cron_schedule zalegają w statusie pending

Cron daemon prawdopodobnie nie odpala cron:run. Sprawdź wpisy crontab i logi.

Test ręczny:

sudo -u www-data php /var/www/magento/bin/magento cron:run --group=default

Jeśli to działa, ale automatycznie nie - problem z cron daemon / wpisami.

Wpisy w statusie error

SELECT job_code, scheduled_at, messages
FROM cron_schedule
WHERE status = 'error'
ORDER BY scheduled_at DESC
LIMIT 20;

Kolumna messages zawiera tekst błędu. Najczęstsze:

  • Zbyt długie wykonanie - zwiększ PHP max_execution_time w php-cli.
  • Out of memory - zwiększ memory_limit w php-cli (php.ini dla CLI).
  • Konkretne błędy z modułów - patrz var/log/system.log z tej samej godziny.

Maile zamówień wysyłają się z opóźnieniem

Domyślnie Magento wysyła maile przez cron, nie natychmiast po złożeniu zamówienia. Konfiguracja:

Stores > Configuration > Sales > Sales Emails > General Settings:

  • Asynchronous SendingDisable (jeśli chcesz mail natychmiast) lub Enable (domyślne, przez cron).

Przy Asynchronous Sending = Enable cron musi działać, inaczej maile leżą w queue.

Wpisy cron_schedule rosną w nieskończoność

Cleanup nie działa. Sprawdź Stores > Configuration > Advanced > System > Cron > Schedules Generation > History Cleanup Every (minutes) - domyślnie 10.

Jeśli mimo to tabela rośnie:

DELETE FROM cron_schedule WHERE scheduled_at < DATE_SUB(NOW(), INTERVAL 7 DAY);

Cron consumes 100% CPU

Najczęściej stuck consumer (queue:consumers:start). Restart:

sudo pkill -f "queue:consumers:start"
# (auto-restart przez supervisor)

Powiązane