C# .netcore ใช้งาน Crontab ไม่ง้อ Linux

Phumipat Chomwattana
2 min readAug 21, 2020

จากปัญหาการใช้งาน console บน linux ที่ต้องกำหนดเวลารัน สมัยก่อนจะใช้ crontab -e บน linux เสมอ ปัญหาคือเกิดความยุ่งยากต้องไปพึ่ง network engineer ตลอด ถ้า build ขึ้น docker ก็ต้องแก้ไขไฟล์ docker เพิ่มเติม ทางแก้ปัญหาคือเราทำการตั้งค่าการรันบน C# เลย ส่งโค้ดขึ้น Git ให้ devops รันเลย ไม่ต้อง shell เพื่อจัดการ Crontab โดยมีการทำงานดังนี้

  1. สร้าง project เป็น netcore webaplication ชนิด API

2. add package Crontab

3. สร้างไฟล์ CrontabService.cs

4. สร้าง Class เพื่อจัดการการตั้งเวลา Crontab

5. สร้าง job เพื่อทดสอบ Crontab

method แต่ละ method จะมีการทำงานตามชื่อของมันเลย นั่นคือ

startasync => การทำงานก่อนรัน Cronjob

stopasync => การทำงานหลังจากรัน Cronjob

เราสามารถเขียนโปรแกรมการทำงานได้ที่ method DoWork ได้ โดยจากตัวอย่างคือ ทดสอบการทำงานของโปรแกรม โดยเมื่อทำงานให้เขียนเวลาออกทางหน้าจอ output

เพิ่ม service ที่สร้างในไฟล์ startup.cs

services.AddHostedService<MyCronJob3>();

และเพิ่มเวลาการรันด้วยคำสั่ง

services.AddCronJob<MyCronJob3>(c =>{c.TimeZoneInfo = TimeZoneInfo.Local;c.CronExpression = @”* * * * 4,5";});

จากตัวอย่างการตั้งค่าให้โปรแกรมรันทุกๆนาที

เราสามารถศึกษาการตั้งเวลาการรันโปรแกรมได้ที่ link

ทดสอบการรันโปรแกรม เปิด power shell พิมพ์คำสั่ง

dotnet watch run

โปรแกรมจะแสดงข้อมูลดังนี้

เราก็จะได้โปรแกรมที่สามารถรันการทำงานได้ด้วยตัวเองแล้วครับ

Reference

https://codeburst.io/schedule-cron-jobs-using-hostedservice-in-asp-net-core-e17c47ba06

https://github.com/bradymholt/cron-expression-descriptor

--

--