5 วิธีง่ายๆที่จะใช้รันโปรแกรมหรือสคริปบน Raspberry Pi เมื่อบอร์ดเริ่มทำงาน
--
ในบทความนี้ เราจะมาพูดถึง 5 วิธีที่เราสามารถทำให้ Raspberry Pi ของเรารันโปรแกรมหรือสคริปที่เราสร้างโดยอัตโนมัติไว้เมื่อตัวบอร์ดเริ่มทำงาน
Crontab
อย่างที่หลายๆคนรู้กันว่า Crontab เป็นเครื่องมือที่ถูกติดตั้งมากับระบบปฏิบัติการ Linux หรือระบบปฏิบัติการที่เป็น Linux Distro ซึ่งช่วยในการรันสคริปหรือโปรแกรมที่เราต้องการตามเวลา หรือสถานการณ์ที่เรากำหนด ทำให้เราไม่ต้องคอยมากดเพื่อสั่งให้โปรแกรมทำงานด้วยตนเอง หรือโปรแกรมที่มีช่วงเวลาการทำงานที่แน่นอน เราก็สามารถนำ Crontab มาประยุกต์ใช้งานได้เช่นกัน
เบื้องต้น เราลองมาทบทวนการใช้งาน Crontab กัน!
โดยเราสามารถเริ่มใช้งาน Crontab ได้โดยใช้คำสั่ง
crontab -e
เพื่อเข้าถึงหน้าตั้งค่าของตัว Crontab
ลองมาดูตัวอย่างกันนะครับ
34 1 * * * sudo reboot
จากข้างต้น หมายความว่า ให้ทำการรีบูทเวลา 01:34 น. ทุกๆวัน
54 20 15 * * mv /home/pi/hello.txt /home/cytorn
จากข้างต้น หมายความว่า ให้ทำการย้ายไฟล์ hello.txt จาก path /home/pi ไปยัง path /home/cytron ทุกวันที่ 15ของทุกเดือน เวลา 20:54 น.
หรือในบางครั้ง เพื่อนๆอาจจะอยากรันโปรแกรมหรือสคริปจากภาษา Python ที่เพื่อนๆเขียนขึ้นมา เราก็สามารถทำได้ ดังตัวอย่างดังภาพครับ
22 11 15 * * /home/pi/python hello.py
ซึ่งจากข้างต้น หมายความว่า เราต้องการรันโปรแกรมหรือสคริปจากภาษา Python ที่ชื่อ hello.py ซึ่งอยู่ใน path /home/pi ทุกๆวันที่ 15 ของทุกเดือน เวลา 11:22 น.
แล้วในกรณีต้องการให้เริ่มทำงานโปรแกรมทุกครั้งที่บอร์ดเริ่มทำงานล่ะ เราสามารถใช้คำสั่ง @reboot ในการสั่งให้เริ่มรันโปรแกรมทุกครั้งที่บอร์ดเริ่มทำงานใหม่ได้เลย
@reboot /home/pi/python hello.py
ซึ่งจากข้างต้น หมายความว่า เราต้องการรันโปรแกรมหรือสคริปจากภาษา Python ที่ชื่อ hello.py ซึ่งอยู่ใน path /home/pi ทุกๆครั้งที่บอร์ดมีการเริ่มการทำงานใหม่ (เปิดเครื่องใช้งาน, มีการรีสตาร์ตเครื่อง)
rc.local
rc.local ก็ถือเป็นอีกหนึ่งเครื่องมือที่ติดมากับ Linux Distro เหมือนกับ crontab โดยมีวิธีการใช้งาน ดังนี้
ใช้คำสั่งด้านล่างเพื่อเข้าไปเพิ่มโปรแกรมหรือสคริปที่ต้องการรันเมื่อบอร์ดเริ่มทำงานด้วย rc.local
sudo nano /etc/rc.local
โดยเราสามารถที่จะนำคำสั่งสำหรับสคริปหรือโปรแกรมเข้าไปวางในนี้ได้เลย โดยมีข้อสังเกตที่ต้องวางก่อนคำสั่ง
exit 0
ที่อยู่ในตัวไฟล์ rc.local ดังภาพ
.bashrc
โดยเราสามารถเข้าไปเพิ่มโปรแกรมหรือสคริปที่เราต้องการให้รันทุกครั้งที่เปิดเครื่องโดย .bashrc ได้โดยใช้คำสั่ง
sudo nano /home/pi/.bashrc
โดยเราจะพบกับคำสั่งมากมายในไฟล์นั้น ให้ทำการเลื่อนลงมาด้านล่างสุด แล้วใส่คำสั่งสำหรับรันโปรแกรมหรือสคริปที่ต้องการให้ทำงานเมื่อเครื่องเปิดลงไปได้เลย ดังภาพ
echo Running at boot
sudo python /home/pi/espeak.py
โดยนอกจากที่โปรแกรมหรือสคริปที่เราใส่ไว้ใน .bashrc จะทำงานทุกๆครั้งที่มีการเปิดเครื่องแล้ว ตัวโปรแกรมหรือสคริปก็จะทำงานด้วยในกรณีที่มีการเปิดหน้า Terminal ขึ้นมาใหม่ทุกๆครั้ง ดังภาพด้านล่าง
init.d
ในส่วนของ init.d นั้นเป็นส่วนของไดเร็กทอรี่ที่เก็บโปรแกรมหรือสคริปที่จะทำงานโดยอัตโนมัติเมื่อมีการเริ่มต้นระบบใหม่ ซึ่งรวมถึงโปรแกรมหรือสคริปพื้นฐานของตัว OS ที่ต้องมีการทำงานใหม่ทุกๆครั้งที่เปิดเครื่องก็จะรวมอยู่ในไดเร็กทอรี่นี้ด้วย
โดยการใช้งานมีขั้นตอน ดังนี้
อันดับแรก เราต้องทำการย้ายสคริปหรือโปรแกรมที่เราต้องการรันเมื่อบอร์ดเริ่มทำงานไปไว้ในไดเร็กทอรี่ init.d ก่อน โดยใช้คำสั่ง
sudo cp /home/pi/espeak.py /etc/init.d/
โดยเมื่อย้ายเรียบร้อยแล้ว เราจะต้องมีการเพิ่มเติมคำสั่งลงไปในโปรแกรมหรือสคริปที่เราเขียนไว้เล็กน้อย โดยมีขั้นตอนดังนี้
cd /etc/ini.d
ใช้คำสั่ง cd เพื่อไปที่ไดเร็กทอรี่ init.d ที่เก็บไฟล์สคริปหรือโปรแกรมของเราก่อน
หลังจากนั้นเข้าไปแก้ไขไฟล์สคริปหรือโปรแกรมโดยใช้คำสั่ง
sudo nano espeak.py
โดยเพิ่มรายละเอียดดังนี้ลงไปในสคริปหรือโปรแกรม
# /etc/init.d/<ชื่อไฟล์สคริปหรือโปรแกรมที่ต้องการรัน>
### BEGIN INIT INFO
# Provides: <ชื่อไฟล์สคริปหรือโปรแกรมที่ต้องการรัน>
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: <คำอธิบายสั้นๆเกี่ยวกับโปรแกรมหรือสคริปตัวนี้>
# Description: <คำอธิบายเกี่ยวกับโปรแกรมหรือสคริปตัวนี้>
### END INIT INFO
โดยหลังจากแก้ไขไฟล์สคริปหรือโปรแกรมเรียบร้อยแล้ว อย่าลืมทำการกำหนดสิทธิการเข้าถึงไฟล์สคริปหรือโปรแกรมของเราโดยใช้คำสั่ง chmod เพื่อให้ระบบปฏิบัติการสามารถเข้าถึงไฟล์สคริปหรือโปรแกรมของเราได้
sudo chmod +x espeak.py
หลังจากนั้นใช้คำสั่ง
sudo update-rc.d espeak.py defaults
เพื่อยืนยันการแก้ไขอีกครั้ง แล้วใช้คำสั่ง
sudo reboot
เพื่อดูผลลัพธ์ที่ได้
SYSTEMD
ขั้นตอนแรก สร้างไฟล์ที่ใช้ในการรันโปรแกรมหรือสคริปของเราโดยอัตโนมัติผ่าน SYSTEMD โดยใช้คำสั่งด้านล่าง
sudo nano /lib/systemd/system/<ชื่อโปรแกรมหรือสคริปของเรา (ไม่ต้องใส่นามสกุล เช่น .py)>.service
หลังจากนั้น พิมพ์คำสั่งเหล่านี้ลงไปในไฟล์ที่เราสร้างขึ้นมา
[Unit]
Description=My Sample Service
After=multi-user.target[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/sample.py
[Install]
WantedBy=multi-user.target
โดยจากคำสั่งข้างต้น เราได้ทำการสร้าง Service ขึ้นมาใหม่ โดยใช้ชื่อตามที่เราตั้งว่า “espeak.service”
โดยคำสั่ง Type = idle หมายความว่า Service ตัวนี้ที่เราสร้างขึ้นมาใหม่จะเริ่มทำงานก็ต่อเมื่อระบบปฏิบัติการเริ่มการทำงานสมบูรณ์แล้ว และอยู่ในสถานะ idle
ExecStart =/usr/bin/python /home/pi/espeak.py หมายถึงการอ้างอิงถึงไฟล์หรือโปรแกรมที่เราต้องการเรียกใช้งานใน service นี้ ซึ่งในตัวอย่างนี้นั่นก็คือตัว python และไฟล์สคริปของเรา
หลังจากนั้น ทำการกำหนดสิทธิ์การเข้าถึงไฟล์สคริปของเราใหม่ โดยใช้คำสั่ง
sudo chmod 644 /lib/systemd/system/espeak.service
หลังจากนั้น ทำการตั้งค่าให้ Service ใหม่ที่เราสร้างขึ้นมา ทำงานเองทุกครั้งที่บอร์ดเริ่มต้นทำงาน โดยใช้คำสั่ง
sudo systemctl daemon-reload
sudo systemctl enable sample.service
หลังจากนั้นใช้คำสั่ง
sudo reboot
เพื่อดูผลลัพธ์ที่ได้
เป็นไงกันบ้างครับ ไม่ยากเลยใช่หรือเปล่าสำหรับ 5 วิธีที่เราสามารถรันโปรแกรมหรือสคริปที่เราต้องการบน Raspberry Pi ทุกครั้งที่บอร์ดถูกเปิด หรือมีการเริ่มทำงานใหม่ ซึ่งเราสามารถนำไปประยุกต์ใช้งานได้อย่างหลากหลาย ช่วยลดภาระการดูแลหรือการทำงานแบบซ้ำๆจากคนที่จะต้องเข้าไปพิมพ์คำสั่ง เพื่อสั่งการทำงานของโปรแกรมด้วยตนเองไปได้เยอะเลยทีเดียว