Za spletno stranjo teče veliko ponavljajočih se opravil: pošiljanje e-novic, objava načrtovanih prispevkov, sinhronizacija zalog spletne trgovine, brisanje začasnih datotek, varnostne kopije, poročila. Teh ni treba zaganjati ročno: cron je časovnik strežnikov Linux, ki ob navedenih časih samodejno izvede ukaz ali skripto. Na gostovanjih cPanel ga nastaviš v grafičnem vmesniku v točki menija Cron Jobs.
V tem vodniku razložimo, kako deluje cron in kako bereš časovni razpored, po korakih ustvarimo opravilo v cPanelu, damo praktične primere ukazov, pokažemo, kako nadomestiš vgrajeni časovnik WordPressa, in zberemo pogoste napake.
Za kaj je cron uporaben?
- WordPress: načrtovani prispevki, opravila vtičnikov, dejanja WooCommerce (glej spodaj nadomestitev wp-cron).
- Spletna trgovina: sinhronizacija zalog in cen z dobaviteljem, ustvarjanje vira izdelkov, e-pošta o zapuščenih košaricah.
- Vzdrževanje: brisanje dnevnikov in začasnih datotek, čiščenje podatkovne baze, praznjenje predpomnilnika.
- Varnostna kopija: varnostna kopija podatkovne baze v datoteko, ki jo nato preneseš ali posreduješ naprej.
- Poročila in obvestila: dnevni povzetki, opozorila.
- Razporejevalniki ogrodij: Laravel, Symfony in mnoga druga ogrodja svoj razporejevalnik gradijo na enem samem vnosu cron, ki teče vsako minuto.
Branje časovnega razporeda cron
Vnos cron je sestavljen iz petih časovnih polj in ukaza:
* * * * * ukaz
│ │ │ │ └── dan v tednu (0–7, nedelja je 0 ali 7)
│ │ │ └───── mesec (1–12)
│ │ └──────── dan v mesecu (1–31)
│ └─────────── ura (0–23)
└────────────── minuta (0–59)
*= vsaka vrednost*/15= vsaka 15. (na primer vsakih 15 minut)1,15= naštevanje1-5= razpon (na primer od ponedeljka do petka)
| Časovni razpored | Pomen |
|---|---|
*/15 * * * * |
Vsakih 15 minut |
0 * * * * |
Na začetku vsake ure |
30 2 * * * |
Vsak dan ob 2.30 |
0 6 * * 1-5 |
Ob delavnikih ob 6. uri zjutraj |
0 3 * * 0 |
V nedeljo ob 3. uri zjutraj |
0 0 1 * * |
Prvi dan vsakega meseca ob polnoči |
Časi veljajo po časovnem pasu strežnika. O sintaksi podrobneje piše članek o sintaksi crontab; če nisi prepričan, lahko na strani crontab.guru vpišeš časovni razpored in z besedami vidiš, kaj pomeni.
Ustvarjanje opravila cron v cPanelu
- Prijavi se v cPanel in v skupini Advanced (Napredno) odpri točko menija Cron Jobs.
- E-poštni naslov (Cron Email): navedi, kam naj sistem pošilja izpis opravil. Med nastavljanjem je koristno, nato pa ga je vredno utišati (glej spodaj).
- Add New Cron Job: na spustnem seznamu Common Settings lahko izbereš pripravljen razpored (na primer »Once Per Day«) ali ročno izpolniš pet polj.
- Command: vnesi ukaz, ki naj se izvede (glej primere).
- Klikni gumb Add New Cron Job. Opravilo se prikaže na spodnjem seznamu, kjer ga lahko pozneje urejaš ali izbrišeš.
Korake s slikami prikazuje tudi članek o ustvarjanju opravila cron v cPanelu.
Primeri ukazov
Zagon skripte PHP (to je najboljša metoda, saj teče neposredno, mimo spletnega strežnika):
/usr/local/bin/php /home/felhasznalonev/public_html/scripts/feladat.php
Namesto felhasznalonev vpiši svoje uporabniško ime cPanel, natančno pot vidiš v upravitelju datotek. Na gostovanjih cPanel pri aWh /usr/local/bin/php zažene različico PHP, ki je za tvoj račun nastavljena v točki menija Select PHP Version.
Klic URL-ja (če opravilo sproži naslov spletne strani in ni neposredno dostopno kot datoteka):
curl -s https://cegnev.hu/cron-feladat > /dev/null 2>&1
ali wget -q -O /dev/null https://cegnev.hu/cron-feladat. To je počasnejše in manj zanesljivo kot neposredni zagon PHP, saj gre prek spletnega strežnika in njegovih časovnih omejitev.
Ukaz WP-CLI (če paket vključuje SSH in WP-CLI):
cd /home/felhasznalonev/public_html && wp cron event run --due-now > /dev/null 2>&1
Razporejevalnik Laravel:
cd /home/felhasznalonev/projekt && /usr/local/bin/php artisan schedule:run > /dev/null 2>&1
Nadomestitev wp-cron WordPressa
WordPress ne uporablja crona strežnika, temveč lasten sistem »navideznega crona«: ob vsakem nalaganju strani preveri, ali je kakšno opravilo zapadlo, in ga, če je, zažene. To ima dve slabosti: na strani z malo prometa opravila zamujajo (če stran nihče ne obišče, se ne izvedejo), na prometni strani pa povzroča nepotrebno obremenitev in upočasnitev.
Rešitev: izklopi vgrajeni časovnik in ga zaganjaj iz crona strežnika.
-
V datoteko
wp-config.phppred vrstico »That’s all, stop editing!« vpiši:define( 'DISABLE_WP_CRON', true ); -
V cPanelu ustvari opravilo cron, na primer z zagonom vsakih 5 ali 15 minut:
/usr/local/bin/php /home/felhasznalonev/public_html/wp-cron.php > /dev/null 2>&1
Pri spletnih trgovinah (WooCommerce) je 5-minutna pogostost dobro izhodišče, pri preprostih blogih zadošča tudi 15-minutna. Podrobne korake opisuje članek o zamenjavi WP-Cron z opravilom cron v cPanelu.
Obravnava izpisa
Privzeto cron izpis vsakega zagona pošlje na navedeni e-poštni naslov. Med nastavljanjem je to koristno, pri opravilu, ki teče vsakih 5 minut, pa bi to pomenilo 288 sporočil na dan. Ko opravilo že dobro deluje, na konec ukaza dopiši:
> /dev/null 2>&1
Če želiš izpis ohraniti, ga zapiši v datoteko (>> /home/felhasznalonev/logs/cron.log 2>&1) in dnevnik občasno izprazni, da se gostovanje ne zapolni.
Odpravljanje težav: če se opravilo ne izvede
- Napačna pot: cron se ne zažene v mapi
public_html, zato do skripte vedno navedi celotno, absolutno pot (in če skripta uporablja relativne poti, prej scdpojdi v njeno mapo). - Napačen PHP: če je ukaz le
php, morda ne zažene pričakovane različice; uporabi celotno pot. - Dovoljenja: skripta naj bo berljiva za tvojega uporabnika; če zaganjaš neposredno izvršljivo datoteko (skripto lupine), naj ima tudi pravico izvajanja.
- Časovni razpored: preveri, ali je pet polj v pravem vrstnem redu in ali si razmišljal v časovnem pasu strežnika.
- Skripta sama je napačna: zaženi jo ročno prek SSH ali iz brskalnika in poglej sporočilo o napaki; začasno znova vklopi pošiljanje izpisa po e-pošti.
- Omejitev virov: na deljenem gostovanju tudi cron teče znotraj omejitev CPU in pomnilnika računa. Težko, dolgo trajajoče opravilo lahko doseže omejitev ali upočasni spletno stran; o tem, kako se cron in SSH štejeta v omejitve virov, piše naš članek baze znanja.
Dobre prakse
- Ne zaganjaj vsega vsako minuto. Premisli, kako pogosto se mora opravilo res izvesti; prepogost zagon obremenjuje vire računa.
- Razprši čase: naj se ne začnejo vsa opravila ob polni uri, izberi na primer 2.17.
- Pri dolgih opravilih poskrbi, da se ne zaženejo znova, dokler teče prejšnje (na primer z zaklepno datoteko ali ukazom
flock). - Gesla ne daj v ukaz ali URL; skrivnosti hrani v konfiguracijski datoteki skripte, zunaj spletnega korena.
- Opravila, ki jih je mogoče sprožiti z URL-jem, zaščiti s skrivnim ključem ali omejitvijo IP, da jih ni mogoče poljubno klicati od zunaj.
Povzetek
Cron je zanesljiv časovnik za ponavljajoča se opravila spletnih strani. V cPanelu ga z nekaj kliki nastaviš v točki menija Cron Jobs; v ukazih vedno uporabljaj celotne poti, izpis delujočih opravil utišaj, pri WordPressu pa vgrajeni wp-cron nadomesti s cronom strežnika. Na gostovanjih cPanel aWh so opravila cron na voljo v vseh paketih.
Pogosta vprašanja
Kako pogosto lahko zaganjam opravilo cron?
Najmanjša enota crona je ena minuta. Na deljenem gostovanju pa opravilo zaganjaj vsako minuto le, če je res potrebno; za večino opravil zadošča pogostost 5–15 minut ali vsako uro.
Kako vem, da se je opravilo izvedlo?
Začasno pusti vklopljeno obvestilo po e-pošti ali izpis zapiši v datoteko dnevnika in jo preglej v upravitelju datotek.
Kakšna je razlika med ukazom php in wget/curl?
Ukaz php skripto zažene neposredno, mimo spletnega strežnika: je hitrejši in zanj ne veljajo spletne časovne omejitve. wget in curl pokličeta naslov spletne strani, kot bi jo odprl obiskovalec; uporabi ju, če je opravilo mogoče sprožiti le prek URL-ja.
Katero pot do PHP naj uporabim?
Na gostovanjih cPanel pri aWh pot /usr/local/bin/php; ta zažene različico PHP, nastavljeno za tvoj račun.
Ali lahko cron upočasni spletno stran?
Da, če težko opravilo teče pogosto, saj uporablja vire, ki si jih deli s spletno stranjo. Težka opravila načrtuj v obdobje z malo prometa in jih ne zaganjaj po nepotrebnem pogosto.
Ali WordPress potrebuje cron?
Ni obvezno, WordPress deluje tudi z vgrajenim časovnikom. Na prometnejši strani in pri spletni trgovini pa ga je vredno nadomestiti s cronom strežnika, ker je zanesljivejši in stran manj obremenjuje.