เพื่อให้ระบบ systemd เรียกใช้งานงานเบื้องหลังของ Nextcloud โดยอัตโนมัติ ให้กำหนดค่าบริการแบบครั้งเดียว (one-shot service) ที่ทำงานcron.phpในฐานะผู้ใช้เว็บเซิร์ฟเวอร์ จากนั้นเปิดใช้งานตัวจับเวลาที่จะเริ่มต้นบริการนั้นทุกๆ ห้านาที การตรวจสอบที่สำคัญคือ: ตัวจับเวลาเปิดใช้งานอยู่และมีเวลาทำงานครั้งถัดไป บริการชี้ไปยังพาธ Nextcloud และ PHP ที่ถูกต้อง และบันทึกการทำงานของบริการแสดงว่าเสร็จสิ้นอย่างสำเร็จ บริการแบบครั้งเดียวอาจแสดงสถานะ "ไม่ทำงาน (dead)" ระหว่างการทำงานแต่ละครั้ง ซึ่งเป็นเรื่องปกติหลังจากที่บริการเสร็จสิ้นแล้ว
การตั้งค่านี้ใช้สำหรับการติดตั้ง Nextcloud แบบทั่วไปบน Ubuntu โดยใช้ systemd โดยมีไฟล์ Nextcloud อยู่บนโฮสต์ หาก Nextcloud ทำงานอยู่ภายใน Docker, Snap หรืออุปกรณ์สำเร็จรูป เช่น Nextcloud All-in-One ให้ใช้วิธีการกำหนดเวลาที่ระบุไว้ในเอกสารของระบบปฏิบัติการนั้นๆ แทนการชี้หน่วยโฮสต์ไปยังพาธเฉพาะคอนเทนเนอร์ ตัวอย่างด้านล่างใช้/var/www/nextcloudและwww-data; โปรดแทนที่ด้วยพาธการติดตั้งจริงและผู้ใช้ HTTP บนเซิร์ฟเวอร์ของคุณ
สิ่งที่ตัวจับเวลาควรทำได้
Nextcloud cron.phpจะรันงานพื้นหลังที่จัดคิวไว้ เช่น การบำรุงรักษาและงานของแอป ตัวจับเวลาของ systemd เปรียบเสมือนนาฬิกา ส่วนบริการคือคำสั่งที่จะทำงานเมื่อเวลาหมดลง คุณจำเป็นต้องมีทั้งสองอย่าง การสร้างไฟล์โดยไม่เปิดใช้งานตัวจับเวลาจะทำให้กำหนดการไม่ทำงาน ในขณะที่การเปิดใช้งานตัวจับเวลาที่ชี้ไปยังพาธ PHP หรือ Nextcloud ที่ไม่ถูกต้องอาจทำให้การทำงานล้มเหลวซ้ำๆ
Nextcloud แนะนำให้ใช้ cron ของระบบสำหรับงานพื้นหลังในสภาพแวดล้อมการผลิต คู่มือการดูแลระบบฉบับปัจจุบันยังระบุถึงตัวจับเวลา systemd เป็นทางเลือกอีกด้วย ตัวอย่างกำหนดการจะเริ่มทำงานห้านาทีหลังจากบูตเครื่อง และกำหนดให้ทำงานอีกครั้งห้านาทีหลังจากเปิดใช้งานบริการแต่ละครั้ง ซึ่งจะช่วยหลีกเลี่ยงการพึ่งพาผู้ใช้ในการเข้าถึงเว็บอินเทอร์เฟซ
1. ยืนยันเส้นทางการติดตั้ง ผู้ใช้ และ PHP CLI
/var/www/nextcloudก่อนแก้ไขหน่วยต่างๆ ให้ค้นหาไดเร็กทอรี Nextcloud ที่แท้จริงและตรวจสอบว่าการติดตั้งเว็บเซิร์ฟเวอร์ต้องการคำสั่ง PHP ใด โดยทั่วไปแล้ว ในการติดตั้ง Ubuntu จากไฟล์เก็บถาวร เส้นทางอาจเป็น ` www-data/etc/nextcloud.com/nextcloud /usr/bin/php...
ls -l /var/www/nextcloud/cron.php
command -v php
php -v
หากไดเร็กทอรี Nextcloud ของคุณอยู่ที่อื่น ให้แทนที่ไดเร็กทอรีนั้นในคำสั่งหน่วยทั้งสองด้านล่าง หากเว็บเซิร์ฟเวอร์ใช้ PHP เวอร์ชันแยกต่างหาก ให้ใช้ไฟล์ปฏิบัติการ CLI ของเวอร์ชันนั้นในExecStartและExecConditionบริการ systemd ไม่ได้สืบทอด PATH หรือสภาพแวดล้อมจากเชลล์แบบโต้ตอบ ดังนั้นเส้นทางที่ระบุอย่างชัดเจนจึงน่าเชื่อถือกว่า
ทดสอบการตรวจสอบสถานะภายใต้ผู้ใช้คนเดียวกันกับที่ systemd จะใช้:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ status -e
ควรรันคำสั่ง ของ Nextcloud occโดยใช้ผู้ใช้ HTTP เพื่อรักษาสิทธิ์การเป็นเจ้าของไฟล์และสิทธิ์การเข้าถึงที่ถูกต้อง หากการทดสอบนี้รายงานข้อผิดพลาด PHP โหมดบำรุงรักษา หรือไฟล์หาย ให้แก้ไขปัญหานั้นก่อน ตัวจับเวลาไม่สามารถชดเชยความล้มเหลวของคำสั่ง Nextcloud ได้
2. สร้างบริการแบบครั้งเดียวจบ
สร้าง/etc/systemd/system/nextcloudcron.service:
sudo nano /etc/systemd/system/nextcloudcron.service
เข้าสู่หน่วยนี้ โดยปรับเส้นทางและผู้ใช้หากการติดตั้งของคุณแตกต่างออกไป:
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
ExecConditionตรวจสอบว่า Nextcloud ทำงานตามปกติหรือไม่ก่อนที่จะเริ่มงานเบื้องหลัง หากเงื่อนไขไม่เป็นไปตามที่กำหนด systemd จะข้ามการทำงาน ตรวจสอบบันทึกเพื่อดูสาเหตุKillMode=processอนุญาตให้โปรแกรมภายนอกที่เริ่มต้นโดยงานเบื้องหลังทำงานต่อหลังจากกระบวนการ cron หลักสิ้นสุดลง ตัวอย่าง Nextcloud ปัจจุบันไม่จำเป็นต้องมี[Install]ส่วนนี้ในไฟล์บริการนี้
การใช้งาน/usr/bin/phpนั้นเหมาะสมเฉพาะเมื่อเป็นตัวแปลภาษา CLI ที่ถูกต้องบนเซิร์ฟเวอร์ของคุณเท่านั้น ตัวอย่างเช่น ที่เก็บ PHP แบบกำหนดเองอาจติดตั้งไบนารีที่มีเวอร์ชันเฉพาะ ใช้เวอร์ชัน PHP ที่เข้ากันได้เดียวกันกับที่ Nextcloud ต้องการและที่การกำหนดค่าเว็บเซิร์ฟเวอร์ใช้
3. สร้างตัวจับเวลา
สร้าง/etc/systemd/system/nextcloudcron.timer:
sudo nano /etc/systemd/system/nextcloudcron.timer
เพิ่ม:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
OnBootSecตั้งเวลาให้ทำงานครั้งแรกห้านาทีหลังจากที่ systemd เริ่มทำงานเมื่อบูตเครื่องOnUnitActiveSecและตั้งเวลาให้ทำงานอีกครั้งห้านาทีหลังจากที่บริการถูกเปิดใช้งานครั้งล่าสุด ตัวจับเวลาไม่เหมือนกับบริการ: ต้องเปิดใช้งานและเริ่มต้น.timerหน่วยเพื่อให้การตั้งเวลาทำงานโดยอัตโนมัติ
4. รีโหลด systemd และเปิดใช้งานตัวจับเวลา
สั่งให้ systemd อ่านไฟล์หน่วยใหม่ จากนั้นเปิดใช้งานและเริ่มตัวจับเวลาด้วยคำสั่งเดียว:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
ตรวจสอบตัวจับเวลา:
systemctl status nextcloudcron.timer
systemctl list-timers --all | grep nextcloudcron
ตัวจับเวลาควรถูกโหลดและทำงานอยู่ และlist-timersควรแสดงเวลาในอนาคตภายใต้ปุ่มถัดไป หากตัวจับเวลาถูกปิดใช้งาน ไม่ถูกโหลด หรือไม่มีการเปิดใช้งานครั้งต่อไป โปรดยืนยันว่าชื่อไฟล์ลงท้ายด้วย ส่วน .timerนั้น[Install]มีWantedBy=timers.targetและคุณได้เรียกใช้คำสั่งdaemon-reloadหลังจากบันทึกไฟล์แล้ว
5. ดำเนินการทดสอบหนึ่งครั้งและตรวจสอบผลลัพธ์
คุณสามารถเริ่มใช้งานบริการได้หนึ่งครั้งโดยไม่ต้องรอให้ตัวจับเวลาทำงานอีกครั้ง:
sudo systemctl start nextcloudcron.service
sudo systemctl status nextcloudcron.service
sudo journalctl -u nextcloudcron.service -n 50 --no-pager
ตรวจสอบผลลัพธ์ของบริการและข้อผิดพลาด PHP หรือ Nextcloud ใดๆ หลังจากคำสั่งเสร็จสิ้นnextcloudcron.serviceอาจกลับไปยังสถานะเดิมinactive (dead)เนื่องจากเป็นงานที่ทำเพียงครั้งเดียว ซึ่งนั่นไม่ได้หมายความว่างานล้มเหลว ตัวจับเวลาควรยังคงทำงานและกำหนดเวลาการทำงานครั้งต่อไป บันทึกควรแสดงว่าการทำงานครั้งก่อนเสร็จสิ้นอย่างสำเร็จหรือไม่
ในการตั้งค่าการดูแลระบบ Nextcloud ให้เปิดพื้นที่สถานะงานเบื้องหลังและตรวจสอบให้แน่ใจว่าเวลาการดำเนินการงานครั้งล่าสุดเลื่อนไปข้างหน้าหลังจากที่ตัวจับเวลาทำงาน คำเตือนภาพรวมควรหายไปเมื่อ Nextcloud ตรวจพบกิจกรรมเบื้องหลังล่าสุด รออย่างน้อยหนึ่งช่วงเวลาหลังจากเปิดใช้งานตัวจับเวลาก่อนที่จะสรุปว่ากำหนดการไม่ได้ทำงาน
วินิจฉัยรูปแบบความล้มเหลวที่พบบ่อย
| สิ่งที่คุณเห็น | สิ่งที่ต้องตรวจสอบ | ขั้นตอนต่อไป |
| ตัวจับเวลา "ไม่ทำงาน" หรือถูกปิดใช้งาน | ไม่ว่าตัวจับเวลาจะถูกเปิดใช้งานและเริ่มทำงานหรือไม่ | รันsudo systemctl enable --now nextcloudcron.timerแล้วตรวจสอบsystemctl list-timers |
| ตัวจับเวลาทำงานอยู่ แต่บริการล้มเหลว | บันทึกการบริการ, ไฟล์ปฏิบัติการ PHP, เส้นทาง Nextcloud และผู้ใช้บริการ | เรียกใช้การทดสอบสถานะโดยwww-dataแก้ไขข้อผิดพลาด PHP หรือข้อผิดพลาดเกี่ยวกับสิทธิ์การเข้าถึงไฟล์ที่พบเป็นครั้งแรก |
| บริการนี้จะไม่ได้ใช้งานระหว่างการทำงานแต่ละครั้ง | เวลาถัดไปของตัวจับเวลาและบันทึกประจำวันสุดท้ายของบริการ | หากบริการปิดตัวลงอย่างสำเร็จและตัวจับเวลายังคงทำงานอยู่ ถือเป็นเรื่องปกติสำหรับอุปกรณ์แบบใช้งานครั้งเดียว |
บริการหยุดทำงานโดยไม่ทำการประมวลผลcron.php | ผลลัพธ์ExecConditionและสถานะว่า Nextcloud อยู่ในโหมดบำรุงรักษาหรือไม่ | แก้ไขข้อผิดพลาดที่เกิดขึ้นและตรวจสอบสถานะ Nextcloud ก่อนเริ่มงานด้วยตนเองอีกครั้ง |
| หน้าผู้ดูแลระบบยังคงรายงานว่า cron ยังไม่ได้ทำงาน | ไม่ว่าบริการจะเรียกใช้อินสแตนซ์ที่ถูกต้องหรือไม่ และเวลาการดำเนินการครั้งล่าสุดจะเปลี่ยนแปลงไปหรือไม่ | รอจนครบช่วงเวลาที่กำหนดไว้ ตรวจสอบบันทึก และตรวจสอบให้แน่ใจว่าคุณกำลังตรวจสอบการติดตั้ง Nextcloud เดียวกัน |
สำหรับรายละเอียดเพิ่มเติม โปรดตรวจสอบบันทึกการให้บริการล่าสุดและไฟล์บันทึกของ Nextcloud:
sudo journalctl -u nextcloudcron.service --since "30 minutes ago" --no-pager
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ background-job:list
รายการงานแสดงงานที่ลงทะเบียนไว้ แต่ไม่ใช่หลักฐานยืนยันว่าตัวจับเวลาทำงานอยู่จริง ควรใช้เวลาการทำงานครั้งล่าสุดและครั้งถัดไปของตัวจับเวลา บันทึกการบริการ และตัวบ่งชี้การทำงานครั้งล่าสุดของ Nextcloud ร่วมกัน
ควรใช้ตัวกำหนดตารางเวลาแบบอื่นเมื่อใด
ตัวจับเวลาของ Systemd ทำงานได้ดีเมื่อเซิร์ฟเวอร์ใช้ Systemd และคุณต้องการกำหนดตารางเวลาแบบโลคอลที่จัดการโดยบริการ หากคุณใช้งานเดมอน cron มาตรฐานอยู่แล้วและสามารถตรวจสอบ crontab ได้ การเพิ่มรายการ cron ของระบบที่เรียกใช้แบบเดียวกันcron.phpก็ได้www-dataรับการสนับสนุนเช่นกัน อย่ากำหนดตารางเวลาทั้งสองวิธีสำหรับอินสแตนซ์ Nextcloud เดียวกัน การเรียกใช้งานที่ซ้ำซ้อนอาจสิ้นเปลืองทรัพยากรและทำให้การแก้ไขปัญหายุ่งยากขึ้น
การกำหนดเวลาด้วย AJAX ขึ้นอยู่กับจำนวนผู้ใช้ที่เข้าชม Nextcloud และมีความน่าเชื่อถือน้อยกว่าสำหรับเซิร์ฟเวอร์ที่มีการใช้งานมากหรือมีผู้ใช้หลายคน การเรียกใช้ Webcron cron.phpผ่าน HTTP อาจเหมาะสมสำหรับอินสแตนซ์ขนาดเล็กมากที่ไม่สามารถเข้าถึงระบบได้ แต่ Nextcloud ระบุว่าการดำเนินการบนเว็บจำกัดปริมาณงานที่สามารถดำเนินการได้ต่อการเรียกใช้หนึ่งครั้ง หาก Nextcloud ถูกบรรจุอยู่ในคอนเทนเนอร์หรือได้รับการจัดการโดยอุปกรณ์ ให้ใช้ตัวกำหนดเวลาหรือการกำหนดค่าคอนเทนเนอร์ที่รองรับ บริการโฮสต์ที่ใช้/var/www/nextcloudจะไม่ทำงานหากไม่มีเส้นทางนั้นอยู่ในโฮสต์
การตั้งค่าที่ดีควรมีตัวจับเวลาที่เปิดใช้งานพร้อมเวลา NEXT ที่เกิดขึ้นซ้ำๆ การทำงานของบริการที่เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด PHP และเวลาการทำงานครั้งล่าสุดของ Nextcloud ที่ก้าวหน้าไปเรื่อยๆ หากทั้งสามอย่างนี้เป็นจริง แต่ภารกิจของแอปพลิเคชันบางอย่างยังคงดูเหมือนล่าช้า ตัวกำหนดเวลาอาจกำลังทำงานอยู่ขณะที่งานนั้นรอการกำหนดเวลาของตัวเอง ช่วงเวลาการบำรุงรักษา หรือเงื่อนไขคิว ตรวจสอบงานนั้นแยกต่างหากก่อนที่จะเปลี่ยนช่วงเวลาของตัวจับเวลา
เอกสารอ้างอิงอย่างเป็นทางการ