Developer Playground: Crontab Mac

Crontab Mac

ปกติก่อนเริ่มทำงานในทุกๆเช้า ผมจะสั่งอัพเดท Homebrew บน Mac เพิ่งคิดได้ว่า ทำไมเราไม่ใช้บริการของ Crontab ให้มันอัพเดทเอง


Developer Playground ซีรี่ส์


สร้างไฟล์ updateBrew.sh

  1. ไปที่โฟลเดอร์ Documents ให้สร้างโฟลเดอร์ CustomScripts
  2. เข้าไปที่โฟลเดอร์ CustomScripts แล้วสร้างไฟล์ updateBrew.sh ด้วยคำสั่ง
touch updateBrew.sh
  1. เปิดไฟล์ updateBrew.sh ด้วย VSCode โดยใช้คำสั่ง
code updateBrew.sh
  1. ใส่โค้ดนี้เข้าไปในไฟล์ updateBrew.sh
#!/bin/zsh
cd ~
brew update && brew upgrade

อธิบายโค้ด

Mac ใช้ zsh เป็น Shell เราจึงใส่โค้ด #!/bin/zsh

cd ~ คือการสั่งให้เคอร์เซอร์ไปอยู่ที่โฟลเดอร์ Home

สั่งอัพเดท Homebrew ด้วย brew update พร้อมกับสั่งอัพเกรดด้วย brew upgrade


เขียนโค้ดเสร็จแล้วสั่ง Save ด้วย command + S ให้เรียบร้อยครับ

  1. กำหนดให้ไฟล์นี้ Executable ด้วยคำสั่ง
chmod +x ~/Documents/CustomScripts/updateBrew.sh

ติดตั้ง CronitorCLI

  1. ไปที่ cronitor.io
  2. Signup หรือ Login ให้เรียบร้อยครับ หลังจากล็อกอินเสร็จแล้วท่านจะได้ API KEY
  3. ไปดูคำแนะนำในการติดตั้ง CronitorCLI

โดยพิมพ์คำสั่งทีละบรรทัดดังนี้ครับ

curl -sOL https://cronitor.io/dl/cronitor-stable-darwin-amd64.zip
sudo unzip cronitor-stable-darwin-amd64.zip -d /usr/bin/
sudo cronitor configure --api-key <your-api-key>

แต่เนื่องจาก MacOS ตั้งแต่เวอร์ชั่น OS X El Capitan มีระบบ System Integrity Protection การเข้าไปแก้ไขโฟลเดอร์ /usr/bin/ ไม่สามารถทำได้ ถ้าจะทำต้องแก้สิทธิ์การเข้าถึงซึ่งผมไม่อยากแตะตรงนั้น ผมจึงขอแก้โค้ดเป็นดังนี้

cd ~
curl -sOL https://cronitor.io/dl/cronitor-stable-darwin-amd64.zip
sudo unzip cronitor-stable-darwin-amd64.zip
sudo ~/cronitor configure --api-key <your-api-key>

พูดง่ายๆคือให้เอาไฟล์ zip มาวางไว้ที่โฟลเดอร์ Home แล้ว unzip ตรงนั้น ท่านจะได้ไฟล์ cronitor

*** ให้สังเกตว่าถ้าเราวางไฟล์ cronitor ไว้ที่ Home เวลาเรียกใช้งาน CronitorCLI ต้องระบุ Path ด้วย

ถ้าเรา unzip CronitorCLI ใน /user/bin ใช้คำสั่ง cronitor [command]

ถ้าเรา unzip CronitorCLI ใน Home ใช้คำสั่ง ~/cronitor [command]


สร้าง Crontab

  1. ไปที่ Terminal ด้วยคำสั่ง cd ~
  2. พิมพ์คำสั่ง crontab -e
crontab -e
  1. เนื่องจากมันจะเปิดด้วย Vim ให้เปลี่ยนโหมดเป็น Insert ด้วยการกดปุ่ม I แล้วเขียนโค้ดดังนี้ครับ
30 10 * * * ~/Documents/CustomScripts/updateBrew.sh

แปลว่า เวลา 10.30 น. ของทุกวัน ให้ทำคำสั่งที่อยู่ใน ~/Documents/CustomScripts/updateBrew.sh อ่านเพิ่มเติม

ซึ่งคำสั่งใน …/updateBrew.sh ก็คือให้ update และ upgrade brew นั่นเอง

  1. สั่ง Save ด้วยการกดปุ่ม esc แล้วพิมพ์ :wq

เชื่อม Crontab เข้ากับ Cronitor

  1. หลังจากสั่ง Save จากขั้นตอนที่แล้ว ที่หน้าจอ Terminal จะแสดงคำว่า crontab: installing new crontab
  1. สั่งเชื่อมต่อ Cronitor (Crontab Monitor) ด้วย
~/cronitor discover

มันจะขึ้น Job name: ให้ตั้งชื่อตามชอบครับ แล้วกด Enter

  1. ลองทดสอบว่าไฟล์ updateBrew.sh ทำงานปกติมั๊ย ให้ใช้คำสั่ง
zsh /path/to/updateBrew.sh

ซึ่งในที่นี้คือ

zsh ~/Documents/CustomScripts/updateBrew.sh
cronitor command
Cronitor command

ทดสอบการเชื่อมต่อกับ Cronitor

  1. ให้ไปที่ cronitor.io เลือกแท็บ Jobs
  2. แล้วคลิ๊กตรงหัวมุมตรงคำว่า Job
Cronitor Jobs
Cronitor Jobs

จะเข้ามาที่หน้าจอ Job ตรงขวามือบนของหน้าจอให้มองหาคำว่า Key แล้วคัดลอกเลข Key ครับ

Cronitor Job
Cronitor Job

กลับมาที่ Terminal พิมพ์คำสั่ง

~/cronitor exec <your-key> ~/path/to/updateBrew.sh

ในที่นี้จะเป็น

~/cronitor exec 4txxxs ~/Documents/CustomScripts/updateBrew.sh

วิธีแก้ปัญหา

Crontab มองไม่เห็นคำสั่ง nvm

สำหรับการสร้าง Crontab ที่ต้องใช้คำสั่ง nvm เช่นการสั่ง update nvm อัตโนมัติ จะมีปัญหาครับ มันจะฟ้อง

command not found: nvm

command not found: nvm
command not found: nvm

วิธีแก้ command not found: nvm

crontab -e

ใน crontab -e ผมจะใส่ /bin/zsh เข้าไปด้วยดังภาพ

crontab -e
crontab -e

ไฟล์ updateNVM.sh

ในไฟล์ updateNVM.sh จะพิเศษหน่อย คือต้องเรียก nvm ก่อนครับ ด้วยโค้ด

#!/bin/zsh
cd ~
# Load nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

จากนั้นก็เขียนโค้ดเพื่ออัพเดท nvm ปกติครับ สุดท้ายแล้วโค้ดทั้งหมดจะเป็นดังนี้

#!/bin/zsh
cd ~
# Load nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

nvm --version
nvm install 'lts/*' --reinstall-packages-from=default --latest-npm
nvm alias default 'lts/*'
updateNVM.sh
updateNVM.sh

Cronitor Failed

ถ้า Cronitor แจ้งสถานะว่า Failed

ให้เข้าไปดู Log file ครับ ด้วยคำสั่ง

nano /var/mail/<user-name>

ถ้าจำ user-name ไม่ได้ ให้ใช้คำสั่ง

cd /var/mail/
ls

เครื่องจะแสดง user-name ทั้งหมด เมื่อได้ user-name แล้ว ก็พิมพ์คำสั่ง

nano <user-name>

ตามตัวอย่างนี้จะเป็น nano manotlj ก็จะได้ Log file ตามภาพนี้ครับ

command not found: brew
command not found: brew

ตรงบรรทัดสุดท้ายมันฟ้อง command not found: brew

ใน Log file ลองไปดูตรง X-Cron-Env: <PATH=/usr/bin:/bin> แต่คำสั่ง brew อยู่ที่ /usr/sbin

ให้แก้ไขโดยเปิดไฟล์ updateBrew.sh แล้วเพิ่มโค้ดนี้เข้าไปครับ

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

ก็จะได้โค้ดดังนี้

#!/bin/zsh
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
cd ~
brew update && brew upgrade

cronitor command

อีกจุดหนึ่งที่อาจเป็นปัญหาคือ ตามบทความนี้แนะนำให้วาง cronitor command ไว้ที่โฟลเดอร์ Home ไม่ใช่ /usr/bin/

ดังนั้นถ้า Cronitor แจ้งสถานะ Failed อีกจุดหนึ่งที่ต้องตรวจคือ crontab -e ว่า cronitor เขียนเป็น cronitor หรือ ~/cronitor ดังนี้

30 10 * * * cronitor exec 4xxxxs ~/Documents/CustomScripts/updateBrew.sh

ให้แก้เป็น

30 10 * * * ~/cronitor exec 4xxxxs ~/Documents/CustomScripts/updateBrew.sh

เอกสารอ้างอิง


สมัครรับบทความ

ท่านจะได้รับบทความเกี่ยวกับเทคนิคในการเขียนโค้ด การสร้างเว็บไซต์ ความรู้ด้านบัญชี ภาษีอากร และอื่นๆ

0 0 votes
ให้คะแนนบทความ
Notify of
guest
0 ความเห็นทั้งหมด
Inline Feedbacks
ดูความเห็นทั้งหมด

บทความแนะนำ

Flask Python framework โดย สรุป

Flask Python framework + Emmet

สรุป วิธีสร้างเว็บไซต์ด้วยภาษา Python โดยใช้ Flask framework และ การตั้งค่า VSCode เพื่อให้สามารถใช้ Emmet ร่วมกับ Flask framework ได้

Redis บน Debian AWS EC2

Redis บน Debian AWS EC2

ติดตั้ง Redis แบบ Manual บน ระบบปฏิบัติการ Debian ที่อยู่บน EC2 ของ AWS Cloud จะช่วยให้การปรับแต่ง Redis เช่น การเพิ่มพอร์ต ทำได้ง่ายขึ้น

Colorize VIM

Developer Playground: Colorize VIM

ตกแต่ง VIM Editor ให้ดู Colorize ด้วย VIM Plug และมันยังมีประโยชน์ต่อการเขียนโค้ดด้วย เพราะมันจะแสดงข้อมูลที่สำคัญบริเวณขอบล่างของหน้าจอ

0
แสดงความเห็นได้นะx
()
x
Scroll to Top
Share on facebook
Share on twitter
Share on linkedin