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:
- Sprawdza tabelę
cron_schedule- jakie zadania są zaplanowane. - Wykonuje te, których czas nastał.
- Aktualizuje status (
pending→running→success/failure). - 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-datana Ubuntu,nginxlubapachena innych dystrybucjach). Inaczej pliki tworzone przez cron będą miały złe uprawnienia.Sprawdź:
ps aux | grep -E 'nginx|apache' | head -1Komendę
cron:installuruchom 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:
-
Czy cron daemon działa?
systemctl status cron # lub crond -
Czy wpisy są w crontab?
crontab -l # crontab użytkownika sudo crontab -l -u www-data # crontab konkretnego usera -
Czy są błędy w logach crona?
tail -100 var/log/magento.cron.log tail -100 /var/log/syslog | grep CRON -
Czy
bin/magento cron:rundziała ręcznie?sudo -u www-data php /var/www/magento/bin/magento cron:run -
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_timew php-cli. - Out of memory - zwiększ
memory_limitw php-cli (php.inidla CLI). - Konkretne błędy z modułów - patrz
var/log/system.logz 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 Sending →
Disable(jeśli chcesz mail natychmiast) lubEnable(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
- Cache i indeksery - schedule mode wymaga crona
- Konfiguracja email i powiadomień - async sending wymaga crona
- Newsletter - kolejka wysyłki działa przez cron
- Logi i diagnostyka - szukanie błędów w
var/log/magento.cron.log