5 วิธีง่ายๆที่จะใช้รันโปรแกรมหรือสคริปบน Raspberry Pi เมื่อบอร์ดเริ่มทำงาน

Cytron Thailand
3 min readJan 21, 2022

ในบทความนี้ เราจะมาพูดถึง 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 ดังภาพ

ต้องการให้รันสคริป Python ชื่อ espeak.py ทุกครั้งที่บอร์ดมีการเริ่มต้นการทำงานใหม่

.bashrc

โดยเราสามารถเข้าไปเพิ่มโปรแกรมหรือสคริปที่เราต้องการให้รันทุกครั้งที่เปิดเครื่องโดย .bashrc ได้โดยใช้คำสั่ง

sudo nano /home/pi/.bashrc

โดยเราจะพบกับคำสั่งมากมายในไฟล์นั้น ให้ทำการเลื่อนลงมาด้านล่างสุด แล้วใส่คำสั่งสำหรับรันโปรแกรมหรือสคริปที่ต้องการให้ทำงานเมื่อเครื่องเปิดลงไปได้เลย ดังภาพ

echo Running at boot
sudo python /home/pi/espeak.py

โดยนอกจากที่โปรแกรมหรือสคริปที่เราใส่ไว้ใน .bashrc จะทำงานทุกๆครั้งที่มีการเปิดเครื่องแล้ว ตัวโปรแกรมหรือสคริปก็จะทำงานด้วยในกรณีที่มีการเปิดหน้า Terminal ขึ้นมาใหม่ทุกๆครั้ง ดังภาพด้านล่าง

คำสั่ง echo ที่เราสร้างไว้เพื่อแสดงตัวอักษร “Running at boot” บน Terminal ทุกๆครั้งที่มีการเปิด 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 ทุกครั้งที่บอร์ดถูกเปิด หรือมีการเริ่มทำงานใหม่ ซึ่งเราสามารถนำไปประยุกต์ใช้งานได้อย่างหลากหลาย ช่วยลดภาระการดูแลหรือการทำงานแบบซ้ำๆจากคนที่จะต้องเข้าไปพิมพ์คำสั่ง เพื่อสั่งการทำงานของโปรแกรมด้วยตนเองไปได้เยอะเลยทีเดียว

--

--