[Cron] มาเล่น cron กันเถอะ

เคยไหมที่เราจะต้องทำ task แบบเดิมๆในช่วงเวลาเดิมๆของทุกวัน ในการพัฒนาระบบ web application

แทนที่เราจะมานั่งรันคำสั่งแบบเดิมๆทุกวัน Cron ได้ตอบโจทย์ของเรา

Cron คืออะไร

Cron มีไว้เพื่อ schedule tasks ที่เราต้องการเช่น กำหนด ณ เวลาเท่านี้ จะต้องทำ task นี้ มันก็จะไปทำ task ตาม script ที่เราเขียนเพื่อไปรัน server

หรือเรียกอีกอย่างว่าเป็น Job scheduler ซึ่งใช้สำหรับ Unix-like operating systems นั่นเอง

และแต่ละ task หรือ job จะถูกเรียกง่ายๆว่า Cron Jobs

ถ้ายังนึกภาพกันไม่ออก ยกตัวอย่างเช่น

  • บริษัท A มีระบบ membership ซึ่งมีจำนวนสมาชิกเยอะมาก เมื่อถึงวันหมดอายุของสมาชิกลูกค้า ก็ไม่จำเป็นมานั่งกด deactivate หรือลบ  account เอง
  • บริษัท B อยากส่ง newsletter email ในรอบวัน หรือประจำเดือน  เพื่อโปรโมตสินค้า
  • บริษัท C มีระบบที่เช็คว่าใน website มีอะไรพังบ้าง จึงอยากให้มีระบบแจ้งเตือนเข้า email ทันที

 

Syntax

ตัวอย่างเช่น

20 * * * *  /usr/bin/python /www/virtual/username/cron.py > /dev/null 2>&1

 

จะแบ่งเป็น 2 ส่วน

  1. ส่วนของ เวลา : ว่าจะรันเวลาเท่าไร
  2. ส่วนที่เหลือ คือ command ที่จะมา run ตรง command line

Timing syntax

 

crontab-syntax
https://www.debian-tutorials.com/crontab-tutorial-cron-howto

จะเป็นส่วนที่บอกว่า Cron Jobs จะรันเมื่อไร เช่น

10 * * * *  == ทุกวัน ทุกชม.เวลา 10 นาที คือ 00.10 น., 01: 10 น., …

*/10 * * * * == ครบทุก 10 นาที จะรัน เราเริ่มตั้งแต่เวลา 13.25 มันก็จะรันอีกรอบตอน 13.35 น.

45 3 * * * == รันตอน 03.45 ของทุกๆวัน ทุกเดือน โดยเวลาจะเริ่มจาก 0 เป็นเที่ยงคืน

0 6-10 * * * == รันทุกๆชม. ระหว่าง 6.00  ถึง 10.00


 

Command ก็จะแบ่งออกเป็น  3 ส่วน

  1. /usr/bin/python : คือ path ของ python ที่เราต้องการจะรัน
  2. /www/virtual/username/cron.py  :  ที่อยู่ของ script
  3. หลัง > ในส่วนนี้จะเป็นส่วนที่จะเก็บ output จากสิ่งที่เกิดขึ้น แต่ในตัวอย่างคือ /dev/null 2>&1  ซึ่งก็คือ blackhole ของระบบ เอาง่ายๆว่า เราไม่เก็บ output นั้นน่ะเอง

 

แบบ “>” จะเป็นการ rewrite โดยเก็บทับไฟล์ไปเลย

 20 * * * *  /usr/bin/python /www/virtual/username/cron.py >> /var/log/cron.log

แบบ “>>” จะเป็นการ  append


 

Crontab command

schedule จะถูกเขียนใน configuration file ที่ชื่อ crontab

 

crontab -e

จะเปิด crontab file ให้เรา edit

crontab -l

list ตัว current cron jobs

crontab -r

remove crontab file


 

Working with Twilio

Twilio จะมี service หนึ่งที่ส่ง text messages เข้า mobile ผ่าน web service APIs

โดยเราจะเขียน cron เพื่อตั้งให้ส่ง SMS เข้ามือถือเราทุกๆ 5 นาที

เข้าไปสมัครและนำ account sid และ auth token กรอกลงตามนี้

send_sms.py


from twilio.rest import TwilioRestClient

account_sid = "XXXXXXXXXXXXXXXX" # Your Account SID from www.twilio.com/console
auth_token = "XXXXXXXXXXXXXXX" # Your Auth Token from www.twilio.com/console

client = TwilioRestClient(account_sid, auth_token)

message = client.messages.create(
body="Hello from the othersideeee",
to="+6690XXXXXXX", # Replace with your phone number
from_="+1201-XXX-XXXX ") # Replace with your Twilio number

print(message.sid)

 

เริ่มด้วย

$ crontab -e

เข้าไป และเขียนคำสั่ง

*/5 * * * * /usr/bin/python /home/ubuntu/send_sms.py

โดย path ของ python หาได้จาก

$ which python

จากนั้นออกมาหน้า command line และรัน cron

$ python /home/ubuntu/send_sms.py

ผลลัพท์ที่ได้ มันก็จะส่ง sms มาทันทีและจะส่งในอีก 5 นาทีถัดไป

img_6707

เย้!  happy-crying-face-meme-11

 

 

One thought on “[Cron] มาเล่น cron กันเถอะ

  1. Pingback: [Cron] เขียน slackbot ส่ง notification เตือน standup meeting | mesodiar

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.