คุณเปิดหน้าผู้ดูแลระบบของ ownCloud แล้วพบว่างานเบื้องหลังไม่ได้ทำงานเมื่อเร็ว ๆ นี้ หรือการล้างข้อมูล กิจกรรม พื้นที่จัดเก็บภายนอก และงานที่อยู่ในคิวอื่น ๆ ดูเหมือนจะล่าช้า ปฏิกิริยาทั่วไปคือการแก้ไขcron.phpหรือเพิ่มรายการ crontab ใหม่ ในเอกสารประกอบการใช้งาน ownCloud Server ปัจจุบันนั้น นั่นไม่ใช่จุดเริ่มต้นที่ดีที่สุด: ownCloud แนะนำให้ใช้โหมดพื้นหลัง Cron และocc system:cronคำสั่ง ตัวจับเวลา systemd สามารถให้เลเยอร์การกำหนดเวลาแทน crontab แบบดั้งเดิมบนโฮสต์ Linux ได้
คู่มือนี้เน้นการติดตั้งแบบแพ็กเกจหรือแบบ bare-metal โดยที่ ownCloud อยู่ในพาธเช่น/var/www/owncloud`/etc/ownCloud/` หากคุณใช้ภาพ Docker อย่างเป็นทางการของ ownCloud โปรดหยุดก่อนที่จะสร้างตัวจับเวลาโฮสต์: เอกสารของ ownCloud ระบุว่าภาพดังกล่าวได้กำหนดค่า cron ภายในไว้แล้ว โดยควบคุมด้วยตัวแปรต่างๆ เช่น `cron` OWNCLOUD_CROND_ENABLEDและOWNCLOUD_CROND_SCHEDULE`cron` โปรดดูเอกสารเกี่ยวกับงานพื้นหลังของ ownCloud ฉบับ ปัจจุบัน
อะไรบ้างที่ได้รับการยืนยันแล้ว อะไรบ้างที่ขึ้นอยู่กับเซิร์ฟเวอร์ของคุณ และอะไรบ้างที่ยังต้องตรวจสอบเพิ่มเติม
ตรวจสอบแล้ว: ownCloud แนะนำให้ใช้ Cron แทน AJAX สำหรับการทำงานเบื้องหลังที่เชื่อถือได้ และมีเอกสารระบุocc system:cronว่าเป็นคำสั่งสำหรับเรียกใช้งานงานเบื้องหลังที่อยู่ในคิว
ขึ้นอยู่กับการติดตั้งของคุณ: ไดเร็กทอรี ownCloud, ไบนารี PHP, บัญชีเว็บเซิร์ฟเวอร์, สภาพแวดล้อม PHP และไม่ว่าคุณจะติดตั้งแบบแพ็กเกจ, คอนเทนเนอร์, อุปกรณ์ หรือการติดตั้งแบบกำหนดเอง
ไม่สามารถทราบได้จากคู่มือทั่วไป: สาเหตุที่งานปัจจุบันของคุณล้มเหลว อาจเป็นปัญหาเกี่ยวกับตัวกำหนดเวลา แต่ก็อาจเป็นปัญหาเรื่องสิทธิ์การเข้าถึง เส้นทางที่ไม่ถูกต้อง การกำหนดค่า PHP CLI ที่แตกต่างกัน การเชื่อมต่อฐานข้อมูล การล็อกไฟล์ หรือความล้มเหลวของงานเบื้องหลังในระดับแอปพลิเคชัน
คำแนะนำ: อย่าสร้างตัวจับเวลาจนกว่าคุณจะสามารถใช้งานคำสั่ง ownCloud ได้อย่างถูกต้องด้วยตนเองภายใต้บัญชีเดียวกันกับที่จะใช้สร้างตัวจับเวลา
ขั้นตอนที่ 1: ยืนยันโหมด Cron และทดสอบ ownCloud ด้วยตนเอง
สำหรับการติดตั้งแบบ Apache/Debian ทั่วไป ผู้ใช้เว็บคือwww-data. โปรดเปลี่ยนทั้งชื่อผู้ใช้และเส้นทางหากสภาพแวดล้อมของคุณแตกต่างออกไป
sudo -u www-data /var/www/owncloud/occ background:cron
sudo -u www-data /var/www/owncloud/occ system:cron
คำสั่งแรกใช้สำหรับเลือกโหมดการทำงานเบื้องหลังของ Cron ใน ownCloud ส่วนคำสั่งที่สองใช้สำหรับเรียกใช้งานเบื้องหลังที่อยู่ในคิวเอกสารคำสั่ง occ ของ ownCloud ระบุว่าsystem:cronคำสั่งนี้มีไว้สำหรับการเรียกใช้งานตามกำหนดเวลา และไม่ควรเปิดใช้งานการแสดงความคืบหน้าในตัวกำหนดเวลาที่ไม่ใช่แบบโต้ตอบ
ควรตรวจสอบด้วยตนเองให้สำเร็จก่อนที่จะใช้ systemd ผลลัพธ์ที่ได้อาจแตกต่างกันไป สิ่งสำคัญคือสถานะการสิ้นสุดของคำสั่งและการไม่มีข้อผิดพลาดของแอปพลิเคชัน
ความเข้าใจผิดที่พบบ่อย: “โหมด Cron” ใน ownCloud ไม่ได้หมายความว่าคุณต้องใช้crondaemon โดยเฉพาะ แต่หมายความว่า ownCloud คาดหวังให้มีตัวกำหนดเวลาภายนอกเพื่อเรียกใช้ตัวรันงานเบื้องหลัง ตัวจับเวลาของ systemd ก็สามารถใช้เป็นตัวกำหนดเวลานั้นได้
ขั้นตอนการดำเนินการ: หากคำสั่งแบบแมนนวลล้มเหลว ให้แก้ไขข้อผิดพลาดนั้นก่อน ตัวจับเวลาจะทำให้เกิดข้อผิดพลาดเดิมซ้ำตามกำหนดเวลาเท่านั้น
ขั้นตอนที่ 2: ค้นหาเส้นทาง PHP และ ownCloud ที่ถูกต้อง
บางโปรแกรมสร้างoccไฟล์ปฏิบัติการโดยตรง ในขณะที่บางโปรแกรมจะคาดเดาผลลัพธ์ได้ง่ายกว่าเมื่อเรียกใช้ผ่านไบนารี PHP CLI โปรดตรวจสอบทั้งสองวิธี:
command -v php
readlink -f /var/www/owncloud/occ
sudo -u www-data /usr/bin/php -f /var/www/owncloud/occ system:cron
เอกสารของ ownCloud เตือนไว้อย่างชัดเจนว่า งานที่กำหนดเวลาไว้จะต้องค้นหา PHP และแสดงเส้นทางแบบเต็มในตัวอย่าง cron เรื่องนี้มีความสำคัญไม่แพ้กันภายใต้ systemd เพราะบริการต่างๆ จะได้รับสภาพแวดล้อมที่ควบคุมได้ แทนที่จะเป็นสภาพแวดล้อมเชลล์แบบโต้ตอบของคุณ
การดำเนินการ: แทนที่/usr/bin/php, /var/www/owncloud, และwww-dataในตัวอย่างที่เหลือด้วยค่าที่ใช้งานได้บนโฮสต์ของคุณ
ขั้นตอนที่ 3: สร้างบริการ systemd แบบครั้งเดียว
สร้าง/etc/systemd/system/owncloud-cron.service:
[Unit]
Description=Run ownCloud background jobs
After=network.target
[Service]
Type=oneshot
User=www-data
Group=www-data
WorkingDirectory=/var/www/owncloud
ExecStart=/usr/bin/php -f /var/www/owncloud/occ system:cron
โดยปกติแล้ว คุณไม่จำเป็นต้องมี[Install]ส่วนสำหรับบริการ เนื่องจากตัวจับเวลาจะเปิดใช้งานบริการนั้นอยู่แล้ว การคงบริการไว้เช่นนี้Type=oneshotยังทำให้เข้าใจวงจรชีวิตของบริการได้ง่ายขึ้น กล่าวคือ บริการจะเริ่มต้นทำงาน รันคำสั่งหนึ่งครั้ง ออกจากระบบ และหยุดทำงานอีกครั้ง
บริการ systemd ควรเรียกใช้คำสั่งเดียวกันกับที่เคยเรียกใช้สำเร็จด้วยตนเอง โดยใช้พาธที่ระบุอย่างชัดเจนและบัญชีผู้ใช้ของเว็บเซิร์ฟเวอร์
ความเข้าใจผิดที่พบบ่อย: บริการ oneshot ที่ไม่ได้ใช้งานไม่ได้หมายความว่าเสียโดยอัตโนมัติ หลังจากดำเนินการสำเร็จแล้ว บริการ oneshot RemainAfterExit=yesจะกลายเป็นไม่ได้ใช้งานตามปกติ
การดำเนินการ: ประเมินความสำเร็จจากรหัสการออกจากระบบและบันทึกประจำวัน ไม่ใช่จากการคาดหวังว่าบริการนี้จะยังคง "ทำงาน" ต่อไป
ขั้นตอนที่ 4: สร้างตัวจับเวลา systemd
สร้าง/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
เอกสารประกอบการใช้งาน host-cron ของ ownCloud แนะนำให้ตั้งเวลาไว้ที่ 15 นาที ตัวจับเวลาข้างต้นทำงานตามจังหวะนั้น การใช้ ตัวจับเวลา Persistent=trueเป็นประโยชน์OnCalendarเพราะ systemd สามารถเรียกใช้งานปฏิทินที่พลาดไปได้หลังจากที่เครื่องกลับมาใช้งานได้อีกครั้ง พฤติกรรมที่แน่นอนยังคงขึ้นอยู่กับเวอร์ชันของ systemd และระยะเวลาที่เครื่องหยุดทำงาน
ตัวจับเวลาปฏิทินสามารถจำลองจังหวะการทำงานของ cron ทุกๆ 15 นาทีตามที่ ownCloud ได้ระบุไว้ ในขณะที่ยังคงจัดการการกำหนดเวลาและการบันทึกข้อมูลไว้ภายใน systemd
คำแนะนำ: หากคุณต้องการช่วงเวลาที่แตกต่างออกไปโดยตั้งใจ ให้เปลี่ยนช่วงเวลานั้นด้วยตนเอง แทนที่จะคัดลอกค่าจากเซิร์ฟเวอร์อื่น การทำงานที่ถี่เกินไปอาจเพิ่มภาระงานเบื้องหลัง ในขณะที่การทำงานที่ถี่น้อยเกินไปอาจทำให้งานที่รอคิวอยู่ล่าช้า
ขั้นตอนที่ 5: รีโหลด systemd และเปิดใช้งานตัวจับเวลา
sudo systemctl daemon-reload
sudo systemctl enable --now owncloud-cron.timer
sudo systemctl status owncloud-cron.timer
daemon-reloadทำให้ systemd อ่านไฟล์หน่วยenable --nowใหม่ ซึ่งจะเปิดใช้งานตัวจับเวลาสำหรับการบูตครั้งต่อไปและเริ่มทำงานทันที
โดยปกติแล้ว ตัวจับเวลาที่เปิดใช้งานควรแสดงactive (waiting)และระบุบริการที่จะเรียกใช้งาน
การดำเนินการ: หากตัวจับเวลาไม่ทำงาน โปรดตรวจสอบsystemctl status owncloud-cron.timerก่อนที่จะเปลี่ยนแปลงการตั้งค่า ownCloud อีกครั้ง
ขั้นตอนที่ 6: ตรวจสอบการทำงานของตัวจับเวลาครั้งถัดไปและครั้งก่อนหน้า
systemctl list-timers owncloud-cron.timer
systemctl list-timers --all | grep owncloud-cron
list-timersนี่เป็นวิธีที่เร็วที่สุดในการตรวจสอบว่า systemd ได้กำหนดเวลาการทำงานครั้งต่อไปแล้วหรือไม่ และเพื่อดูว่าตัวจับเวลาทำงานครั้งล่าสุดเมื่อใด ซึ่งจะช่วยแยกแยะระหว่าง “ตัวจับเวลาไม่เคยทำงาน” กับ “ตัวจับเวลาทำงาน แต่ ownCloud ล้มเหลวภายในบริการ”
รายการตัวจับเวลาควรแสดงทั้งหน่วยตัวจับเวลาและบริการที่เปิดใช้งาน พร้อมด้วยข้อมูลเวลา
ใช้คอลัมน์ NEXT และ LAST เพื่อตรวจสอบการกำหนดเวลาแทนที่จะสันนิษฐานว่าการไม่มีกิจกรรมบนเว็บที่มองเห็นได้หมายความว่า cron เสีย
การดำเนินการ: หากไม่พบ NEXT หรือไม่พบตัวจับเวลา ให้ตรวจสอบชื่อไฟล์ตัวจับเวลา[Install]ส่วน และตรวจสอบว่าได้เปิดใช้งานอุปกรณ์แล้วหรือไม่
ขั้นตอนที่ 7: ตรวจสอบสมุดบันทึกการบริการ ไม่ใช่แค่ตัวจับเวลา
systemd จะบันทึกผลลัพธ์ของบริการลงในบันทึกเหตุการณ์ (journal) เว้นแต่คุณจะจงใจเปลี่ยนเส้นทางการบันทึกไปยังที่อื่นเอกสารอย่างเป็นทางการของ journalctl อธิบายถึงการกรองรายการในบันทึกเหตุการณ์ตามหน่วยของ systemd
sudo journalctl -u owncloud-cron.service --since today
sudo journalctl -u owncloud-cron.service -n 100 --no-pager
บันทึกการบริการเป็นจุดที่ความสำเร็จของตัวกำหนดเวลาและความล้มเหลวของคำสั่ง ownCloud แตกต่างกัน: ตัวจับเวลาอาจทำงานได้อย่างถูกต้องแม้ว่าคำสั่งที่เรียกใช้จะส่งคืนข้อผิดพลาดก็ตาม
ความเข้าใจผิดที่พบบ่อย: “ตัวจับเวลาทำงานอยู่ ดังนั้น cron ของ ownCloud จึงทำงานได้” ตัวจับเวลาที่ทำงานอยู่เป็นเพียงการพิสูจน์ว่าตัวกำหนดเวลาพร้อมที่จะทำงานเท่านั้น คุณยังคงต้องการการเรียกใช้บริการที่สำเร็จอยู่ดี
ขั้นตอนการดำเนินการ: ตรวจสอบหาข้อผิดพลาด PHP, ข้อความปฏิเสธสิทธิ์การเข้าถึง, ไฟล์หาย, ข้อผิดพลาดฐานข้อมูล หรือสถานะการออกที่ไม่เป็นศูนย์ แก้ไขข้อผิดพลาดที่พบเป็นครั้งแรกแทนที่จะเริ่มจับเวลาใหม่ซ้ำๆ
ขั้นตอนที่ 8: เรียกใช้งานหนึ่งครั้งตามต้องการและตรวจสอบ ownCloud
คุณไม่จำเป็นต้องรอ 15 นาทีสำหรับการทดสอบครั้งสุดท้าย:
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
หลังจากดำเนินการคำสั่งแบบครั้งเดียวสำเร็จแล้วsystemctl statusสามารถรายงานว่าบริการนั้นไม่ทำงานได้อย่างถูกต้อง พร้อมทั้งแสดงstatus=0/SUCCESSผลลัพธ์ที่สำคัญคือ คำสั่งนั้นเสร็จสมบูรณ์แล้ว
การเริ่มบริการด้วยตนเองเป็นการทดสอบแบบครบวงจรที่ใช้งานได้จริง เพื่อตรวจสอบคำสั่ง ผู้ใช้ เส้นทาง และสภาพแวดล้อม PHP ที่กำหนดค่าไว้ใน systemd อย่างแม่นยำ
ขั้นตอนการดำเนินการ: หลังจากที่การทดสอบบริการด้วยตนเองสำเร็จแล้ว ให้รออย่างน้อยหนึ่งครั้งจนกว่าตัวจับเวลาที่กำหนดไว้จะทำงาน และยืนยันว่ามีรายการบันทึกใหม่ปรากฏขึ้นโดยไม่ต้องมีการแทรกแซงด้วยตนเอง
ถ้ายังใช้งานไม่ได้: ให้ลองแก้ไขปัญหาทีละเลเยอร์
อาการที่สังเกตได้ สิ่งที่พิสูจน์ได้ ขั้นตอนต่อไป
occ system:cronล้มเหลวด้วยตนเองปัญหาอยู่ที่ระดับต่ำกว่าเลเยอร์ตัวจัดตารางเวลา แก้ไขข้อผิดพลาดเกี่ยวกับ PHP, สิทธิ์การเข้าถึง, การกำหนดค่า ownCloud, ฐานข้อมูล หรือแอปพลิเคชันก่อน
คำสั่งแบบแมนนวลใช้งานได้ แต่บริการล้มเหลว สภาพแวดล้อมการทำงานของ systemd ของคุณแตกต่างจากเชลล์ ตรวจสอบUser=เส้นทางWorkingDirectory=แบบเต็มและบันทึกประจำวัน
บริการทำงานด้วยตนเอง ตัวจับเวลาไม่มีคำสั่ง NEXT run บริการนี้ใช้งานได้ แต่การนัดหมายใช้งานไม่ได้ ตรวจสอบไวยากรณ์ของตัวจับเวลา รีโหลด systemd จากนั้นเปิดใช้งานและเริ่มต้นตัวจับเวลา
ตัวจับเวลาแสดงเวลาถัดไป/เวลาสุดท้ายแล้ว แต่กระบวนการทำงานบน ownCloud ยังคงล่าช้าอยู่ ตัวจับเวลาทำงานแล้ว ตรวจสอบบันทึกการบริการและงานระดับแอปพลิเคชันแทนที่จะสร้างตัวกำหนดเวลาใหม่
อิมเมจ Docker อย่างเป็นทางการ ระบบ systemd ของโฮสต์อาจไม่ใช่เลเยอร์ที่ถูกต้อง ใช้การตั้งค่า cron ในตัวของอิมเมจตามที่ ownCloud ได้ระบุไว้ในเอกสาร
หมายเหตุเกี่ยวกับ cron.php และคู่มือฉบับเก่า
คำสั่ง ownCloud เวอร์ชันเก่ามักเรียกใช้cron.phpโดยตรง เอกสาร ownCloud เวอร์ชันปัจจุบันแนะนำให้ใช้occ system:cronและบันทึกการเผยแพร่ ownCloud อธิบายถึงการเปลี่ยนจากcron.phpวิธีการเรียกใช้โดยตรงแบบเก่า ดูบันทึกการเผยแพร่ ownCloud Server
คำแนะนำ: หากคุณได้รับ crontab หรือ systemd unit เก่ามาใช้งานcron.phpให้เปรียบเทียบกับเอกสารประกอบสำหรับ ownCloud เวอร์ชันที่คุณติดตั้งไว้ก่อนที่จะใช้งานต่อ
รายการตรวจสอบการยืนยันขั้นสุดท้าย
ownCloud ได้รับการตั้งค่าให้ทำงานเบื้องหลังด้วย Cron แล้ว
คำสั่ง ดังocc system:cronกล่าวทำงานได้อย่างถูกต้องภายใต้บัญชีเว็บเซิร์ฟเวอร์ที่ต้องการ
owncloud-cron.timerเปิดใช้งานแล้วและactive (waiting).
systemctl list-timersแสดงทั้งการเปิดใช้งานครั้งถัดไปและครั้งก่อนหน้าหลังจากเวลาผ่านไปนานพอสมควร
journalctl -u owncloud-cron.serviceแสดงให้เห็นว่าการดำเนินการตามกำหนดการสำเร็จลุล่วงไปด้วยดี
การตั้งค่านี้ไม่ได้ทำซ้ำการทำงานของ cron ที่มีอยู่แล้วในอิมเมจ Docker อย่างเป็นทางการของ ownCloud หรือตัวกำหนดเวลาอื่นๆ
เมื่อการตรวจสอบเหล่านั้นผ่านทั้งหมด คุณได้ยืนยันมากกว่าแค่ "มีตัวจับเวลาอยู่" แล้ว: คุณได้แสดงให้เห็นว่า systemd กำหนดเวลาการทำงาน เรียกใช้ ownCloud ภายใต้บัญชีที่ถูกต้อง และดำเนินการเรียกใช้งานเบื้องหลังได้สำเร็จ