ไลบรารี PHP เพื่อจัดการงาน GNU/Linux cron
ช่วยให้คุณสามารถ:
crontab (ควรติดตั้งในการแจกจ่ายของคุณแล้ว)sudo หากคุณต้องการจัดการ crontab ของผู้ใช้รายอื่นมากกว่าผู้ใช้ Runtime โดยไม่ต้องพบปัญหาที่ถูกต้อง (ดูด้านล่าง) ห้องสมุดสามารถติดตั้งได้โดยใช้นักแต่งเพลง
composer require tiben/crontab-manager ~1.0
ห้องสมุดประกอบด้วยสามคลาส:
CrontabJob เป็นคลาสเอนทิตีที่แสดงถึงงาน cronCrontabRepository ใช้เพื่อคงอยู่/ดึงงาน cron ของคุณCrontabAdapter จัดการงาน cron stenservance ใน crontabเพื่อที่จะทำงาน crontabrepository ต้องการอินสแตนซ์ของ crontabadapter
$crontabRepository = new CrontabRepository(new CrontabAdapter());
สมมติว่าคุณต้องการสร้างงานใหม่ซึ่งประกอบด้วยการเปิดตัวคำสั่ง "df >> /tmp/df.log" ทุกวันเวลา 23:30 น. คุณสามารถทำได้สองวิธี
ด้วยวิธี OO บริสุทธิ์:
$crontabJob = new CrontabJob();
$crontabJob
->setMinutes(30)
->setHours(23)
->setDayOfMonth('*')
->setMonths('*')
->setDayOfWeek('*')
->setTaskCommandLine('df >> /tmp/df.log')
->setComments('Logging disk usage'); // Comments are persisted in the crontab
จากสตริงไวยากรณ์ Raw Cron โดยใช้วิธีโรงงาน:
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
ตอนนี้คุณสามารถเพิ่ม cronjob ใหม่ของคุณในที่เก็บ crontab และคงการเปลี่ยนแปลงทั้งหมดไปยัง crontab
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
สมมติว่าเราต้องการแก้ไขชั่วโมงของ cronjob ที่มีอยู่แล้ว การค้นหางานที่มีอยู่นั้นทำโดยใช้นิพจน์ทั่วไป regex ถูกนำไปใช้กับสาย crontab ทั้งหมด
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
คุณสามารถลบงานแบบนี้ได้:
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
หมายเหตุ: เนื่องจากงาน cron ถูกจับคู่ภายในโดยการอ้างอิงจึงต้องได้รับก่อนหน้านี้จากที่เก็บหรือเพิ่มก่อนหน้านี้
คุณสมบัตินี้ช่วยให้คุณจัดการ crontab ของผู้ใช้รายอื่นได้มากกว่าผู้ใช้ที่เปิดตัวรันไทม์ สิ่งนี้จะมีประโยชน์เมื่อผู้ใช้รันไทม์เป็น www-data แต่เจ้าของ crontab ที่คุณต้องการแก้ไขคือบัญชีผู้ใช้ Linux ของคุณเอง
ในการทำสิ่งนี้เพียงแค่ผ่านชื่อผู้ใช้ของเจ้าของ crontab เป็นพารามิเตอร์ของ crontabadapter constructor สมมติว่าคุณเป็น www-data และคุณต้องการแก้ไข crontab ของผู้ใช้ bobby :
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
การใช้วิธีนี้คุณจะพบปัญหาสิทธิ์ของผู้ใช้ สิ่งนี้สามารถจัดการได้โดยการแก้ไขไฟล์ sudoers ของคุณโดยใช้ 'Visudo'
หากคุณต้องการอนุญาตให้ผู้ใช้ www-data แก้ไข crontab ของผู้ใช้ bobby เพิ่มบรรทัดนี้:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
ซึ่งบอกว่า Sudo ไม่ขอรหัสผ่านเมื่อผู้ใช้ www-data เรียก crontab เป็นผู้ใช้ bobby โดยใช้ sudo
ตอนนี้คุณสามารถเข้าถึง crontab ของผู้ใช้ bobby เช่นนี้:
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
หมายเหตุพารามิเตอร์ที่สอง true ของการเรียก crontabadapter constructor บูลีนนี้บอก Crontabadapter ให้ใช้ sudo ภายในเมื่อโทรหา crontab
คุณสามารถเปิดใช้งานหรือปิดใช้งานงาน cron ของคุณโดยใช้วิธี setEnabled() ของวัตถุ cronjob ตามนั้น:
$crontabJob->setEnabled(false);
สิ่งนี้จะรวมงาน cron ของคุณด้วย # ใน crontab ของคุณเมื่อคงอยู่
นอกจากนี้หากคุณไม่สามารถอ่าน crontabs ของผู้ใช้รายอื่นได้หรือหากคุณอยู่ในสถาปัตยกรรมแบบกระจายที่ crons ไม่ทำงานบนเครื่องที่ทำงานทำงานคุณสามารถสร้างอะแดปเตอร์อื่น ๆ สำหรับสถาปัตยกรรมของคุณโดยใช้ CrontabAdapterInterface
จากนั้นคุณสามารถสร้างอินสแตนซ์ CrontabRepository ด้วยอะแดปเตอร์ของคุณ
การทดสอบได้รับการเขียนโดยใช้ phpunit และต้องการเวอร์ชัน 5.3+ เพื่อดำเนินการทดสอบ:
$ phpunit <crontab-library-path>/tests
หากคุณติดตั้งไลบรารีโดยใช้นักแต่งเพลงและการติดตั้งแบบพึ่งพาอาศัยกัน
$ ./vendor/bin/phpunit <crontab-library-path>/tests
... ยินดีต้อนรับ :)