Acasă
» ADMIN. REȚEA
»
Fix ownCloud Cron Job Not Running: Set Up a Reliable systemd Timer
Fix ownCloud Cron Job Not Running: Set Up a Reliable systemd Timer
You open ownCloud’s admin page and see that background jobs have not run recently, or cleanup, activity, external-storage, and other queued tasks seem delayed. A common reaction is to edit cron.php or add another crontab entry. On current ownCloud Server documentation, that is not the best starting point: ownCloud recommends the Cron background mode and the occ system:cron command. A systemd timer can provide the scheduling layer instead of traditional crontab on a Linux host.
This guide focuses on a package or bare-metal style installation where ownCloud lives under a path such as /var/www/owncloud. If you use ownCloud’s official Docker image, stop before creating a host timer: ownCloud documents that the image already configures cron internally, controlled by variables such as OWNCLOUD_CROND_ENABLED and OWNCLOUD_CROND_SCHEDULE. See the current ownCloud background jobs documentation.
What is verified, what depends on your server, and what still needs checking
Verified: ownCloud recommends Cron rather than AJAX for reliable background execution, and documents occ system:cron as the command to execute queued background jobs.
Depends on your installation: the ownCloud directory, PHP binary, web-server account, PHP environment, and whether you run a package install, container, appliance, or custom deployment.
Not knowable from a generic guide: why your current job failed. It may be a scheduler problem, but it can also be permissions, a wrong path, a different PHP CLI configuration, database connectivity, file locking, or an application-level background job failure.
Action: do not create a timer until the exact ownCloud command works manually under the same account that the timer will use.
Step 1: Confirm Cron mode and test ownCloud manually
For a typical Apache/Debian-style installation, the web user is www-data. Replace both the user and path if your environment differs.
The first command selects ownCloud’s Cron background-job mode. The second actually runs queued background jobs. ownCloud’s occ command documentation states that system:cron is intended for scheduled execution and that progress output should not be enabled in a non-interactive scheduler.
A manual check should succeed before systemd is involved. The exact output can vary; the important test is the command’s exit status and absence of application errors.
Common misunderstanding: “Cron mode” in ownCloud does not mean you must use the cron daemon specifically. It means ownCloud expects an external scheduler to invoke its background-job runner. A systemd timer can be that scheduler.
Acțiune: dacă comanda manuală eșuează, remediați mai întâi eroarea respectivă. Un cronometru va repeta aceeași eroare doar într-un anumit interval orar.
Pasul 2: Găsiți căile corecte PHP și ownCloud
Unele instalări fac occexecutabil direct; altele sunt mai previzibile atunci când sunt invocate cu binarul CLI PHP. Confirmați ambele:
Documentația ownCloud avertizează explicit că joburile programate trebuie să găsească PHP și, prin urmare, afișează căile complete în exemplele cron. Acest lucru contează la fel de mult și în systemd, deoarece serviciile primesc un mediu controlat, mai degrabă decât mediul interactiv shell.
Acțiune: înlocuiți /usr/bin/php, /var/www/owncloud, și www-dataîn exemplele rămase cu valorile care au funcționat pe gazda dvs.
În mod normal, nu aveți nevoie de o [Install]secțiune pentru serviciu, deoarece cronometrul îl activează. Păstrarea serviciului ca Type=oneshotaces face, de asemenea, ușor de interpretat ciclul său de viață: pornește, execută comanda o dată, se închide și devine din nou inactiv.
Serviciul systemd ar trebui să apeleze manual aceeași comandă care a reușit deja, folosind căi explicite și contul serverului web.
Neînțelegere frecventă: un serviciu one-shot inactiv nu este automat defect. După o rulare reușită, un serviciu one-shot fără acest serviciu RemainAfterExit=yesdevine în mod normal inactiv.
Acțiune: judecați succesul după codul de ieșire și jurnal, nu așteptându-vă ca acest serviciu să rămână „în funcțiune”.
Pasul 4: Creați cronometrul systemd
Creați /etc/systemd/system/owncloud-cron.timer:
[Unit]
Description=Run ownCloud background jobs every 15 minutes
[Timer]
OnCalendar=*:0/15
Persistent=true
Unit=owncloud-cron.service
[Install]
WantedBy=timers.target
Documentația host-cron a ownCloud recomandă un program de 15 minute. Cronometrul de mai sus respectă această cadență. Persistent=trueeste util cu un OnCalendarcronometru deoarece systemd poate declanșa o activare a calendarului ratată după ce mașina devine din nou disponibilă. Comportamentul exact depinde în continuare de versiunea systemd și de cât timp mașina a fost nefuncțională.
Un cronometru de calendar poate oglindi cadența cron de 15 minute documentată de ownCloud, păstrând în același timp programarea și înregistrarea în jurnal în systemd.
Acțiune: dacă aveți nevoie intenționat de un interval diferit, modificați-l în mod deliberat, în loc să copiați o valoare de pe un alt server. Execuția mai frecventă poate crește încărcarea în fundal; execuția mai puțin frecventă poate întârzia lucrările din coadă.
Pasul 5: Reîncărcați systemd și activați cronometrul
list-timerseste cea mai rapidă metodă de a confirma că systemd a programat o următoare activare și de a vedea când s-a declanșat ultima dată cronometrul. Aceasta face diferența între „cronometrul nu a funcționat niciodată” și „cronometrul a funcționat, dar ownCloud a eșuat în cadrul serviciului”.
Lista de temporizatoare ar trebui să afișeze atât unitatea de temporizator, cât și serviciul pe care îl activează, împreună cu informații despre temporizare.Folosește coloanele NEXT și LAST pentru a verifica programarea în loc să presupui că absența activității web vizibile înseamnă că cron-ul este defect.
Acțiune: dacă lipsește NEXT sau cronometrul nu este listat, verificați din nou numele fișierului cronometrului, [Install]secțiunea și dacă unitatea a fost activată.
Pasul 7: Verificați jurnalul de service, nu doar cronometrul
systemd înregistrează ieșirea serviciului în jurnal, cu excepția cazului în care o redirecționați în mod deliberat în altă parte. Documentația oficială journalctl descrie filtrarea intrărilor din jurnal după unitatea systemd.
Jurnalul de servicii este locul unde succesul planificatorului se separă de eșecurile comenzii ownCloud: un cronometru se poate declanșa corect chiar și atunci când comanda invocată returnează o eroare.
Neînțelegere frecventă: „Cronometrul este activ, deci cronul ownCloud funcționează.” Un cronometru activ dovedește doar că planificatorul așteaptă să se declanșeze. Totuși, este nevoie de o invocare reușită a serviciului.
Acțiune: căutați erori PHP, mesaje cu permisiune refuzată, fișiere lipsă, erori în baza de date sau o stare de ieșire diferită de zero. Remediați prima eroare concretă în loc să reporniți cronometrul în mod repetat.
Pasul 8: Declanșați o rulare la cerere și verificați ownCloud
Nu trebuie să așteptați 15 minute pentru un test final:
sudo systemctl start owncloud-cron.service
sudo systemctl status owncloud-cron.service
sudo -u www-data /usr/bin/php -f /var/www/owncloud/occ status
După o rulare cu succes a unei singure comenzi, systemctl statusse poate raporta în mod legitim serviciul ca inactiv, afișând în același timp status=0/SUCCESS. Rezultatul important este că comanda s-a finalizat cu succes.
O pornire manuală a unui serviciu este un test practic complet al comenzii, utilizatorului, căilor și mediului PHP configurat în systemd.
Acțiune: după ce testul de service manual are succes, așteptați cel puțin o activare programată a temporizatorului și confirmați că apare o nouă intrare în jurnal fără intervenție manuală.
Dacă tot nu rulează: depanați pe straturi
Simptom observat
Ceea ce dovedește
Acțiunea următoare
occ system:croneșuează manual
Problema este sub stratul planificatorului
Mai întâi corectați erorile PHP, permisiunilor, configurației ownCloud, bazei de date sau aplicației.
Comanda manuală funcționează, dar serviciul eșuează
Mediul de execuție systemd diferă de cel al shell-ului
Verificați User=, WorkingDirectory=, căile complete și jurnalul.
Serviciul funcționează manual, cronometrul nu are următoarea rulare
Serviciul este valid; programarea nu este
Verificați sintaxa cronometrului, reîncărcați systemd, apoi activați și porniți cronometrul.
Cronometrul are timpi NEXT/LAST, dar joburile ownCloud încă întârzie
Cronometrul se declanșează
Inspectați jurnalele de servicii și joburile la nivel de aplicație în loc să creați un alt planificator.
Imagine oficială Docker
Gazda systemd ar putea fi stratul greșit
Folosește configurația cron încorporată a imaginii, documentată de ownCloud.
O notă despre cron.php și ghidurile mai vechi
Instrucțiunile ownCloud mai vechi sunt adesea invocate cron.phpdirect. Documentația actuală ownCloud recomandă occ system:cron, iar notele de lansare ownCloud explică migrarea de la cron.phpabordarea directă mai veche. Consultați notele de lansare ownCloud Server .
Acțiune: dacă ați moștenit o unitate crontab sau systemd veche care rulează cron.php, comparați-o cu documentația pentru versiunea ownCloud instalată înainte de a o păstra.
Lista de verificare finală
ownCloud este configurat pentru joburi Cron în fundal.
Comanda exactă occ system:cronreușește sub contul de server web dorit.
owncloud-cron.timereste activat și active (waiting).
systemctl list-timersarată atât o activare următoare, cât și una anterioară după ce a trecut suficient timp.
journalctl -u owncloud-cron.serviceafișează execuțiile programate cu succes.
Configurarea nu duplică cron-ul deja furnizat de imaginea oficială ownCloud Docker sau de un alt planificator.
Când toate aceste verificări trec cu succes, ați verificat mai mult decât „existența unui cronometru”: ați demonstrat că systemd programează jobul, invocă ownCloud în contul corect și finalizează cu succes rularea jobului în fundal.