วิธีเรียกใช้โปรแกรมในเวลา Start up บน Raspberry Pi

หากท่านมีโปรแกรมที่ต้องการให้ถูกเรียกใช้งานได้เองในเวลา Start up ของ Raspberry Pi แล้วละก็ มีทางเลือกหลายทางที่จะทำได้ครับ



สมมุติว่าผมทำโปรแกรมให้ Raspberry Pi ทักทายผมด้วยประโยค "Hello Somchai, I am ready to work." ทุกครั้งหลังจาก boot เครื่องเสร็จ และโปรแกรมนี้ผมเขียนด้วยภาษา Python ดังนี้


#! /usr/bin/env  python

import subprocess

cmd = 'espeak -ven+f3 -k5 -s150 "Hello Somchai, I am ready to work." '
subprocess.call([cmd],shell=True)



หมายเหตุ ต้องติดตั้ง espeak ก่อนด้วย sudo apt-get install espeak



แล้วบันทึกไว้ในไฟล์ชื่อ greeting.py  เก็บไว้ที่ /home/pi





ทางเลือกที่ 1. ใช้ rc.local

เพิ่มคำสั่งใน /etc/rc.local โดยนำไปต่อจากบรรทัดสุดท้าย


sudo /usr/bin/python /home/pi/greeting.py & 2>/dev/null
exit 0


คำอธิบาย

1. ต้องใช้สิทธิของ root ในการใช้คำสั่ง

2. ใช้ full path สำหรับอ้างถึงไฟล์

3. การใช้ & จะช่วยเพิ่มความปลอดภัย ในกรณีที่เกิดความผิดพลาดในการทำงานของโปรแกรม กระบวนการ boot จะยังคงดำเนินต่อไปได้ (จะไม่ใส่ก็ได้ หากมั่นใจว่าไม่มีปัญหา)

4. 2>/dev/null หมายถึงให้ระบบทำงาน redirect ข้อความที่เกี่ยวกับความผิดพลาด ออกไปที่ /dev/null (ไม่แสดงให้เห็นทางหน้าจอ)

5.  การใส่ exit 0 เข้าไปเพื่อบอกกับระบบว่า ทุกอย่างเรียบร้อยดี  ( 0 | 1 เป็น exit code มีความหมายดังนี้ 0 = success, 1 = fail) หากพบว่ามีคำสั่ง exit 0 อยู่แล้ว ให้พิมพ์คำสั่งของเราไว้ก่อนหน้า exit 0



สิ่งที่ควรทราบ

1. การนำคำสั่งไปใส่ไว้ใน /etc/rc.local หมายถึงการนำเอาคำสั่งของเราเข้าไปร่วมอยู่กระบวนการ boot ของระบบปฏิบัติการด้วย ดังนั้นคำสั่งหรือโปรแกรมที่นำไปใช้นั้นต้องไม่ทำให้กระบวน boot สะดุด



2.  เป็นไปได้ว่าการทำในลักษณะนี้อาจจะไม่ได้ผลตามที่ต้องการ  ทั้งนี้อาจเป็นเพราะโปรแกรมของเราอาจต้องใช้ทรัพยากรอื่นที่ยังไม่ได้พร้อมใช้งานก็ได้



ทางเลือกที่ 2 : ย้ายโปรแกรมไปไว้ใน /etc/init.d/

ต้องเปลี่ยนแปลงเนื้อหาใน greeting.py  ตามมาตรฐานของ Linux กำหนดไว้ก่อน ดังตัวอย่าง


#! /usr/bin/env python
### BEGIN INIT INFO
# Provides:          greeting.py
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

import subprocess

cmd = 'espeak -ven+f3 -k5 -s150 "Hello Somchai, I am ready to work" 2>/dev/null'
subprocess.call([cmd],shell=True)


หมายเหตุ หากเข้าไปดูไฟล์ใน /etc/init.d/  ทุกไฟล์จะมีต้องมีโครงสร้างเหมือนกับตัวอย่างข้างบนนี้



ทำการย้ายจาก /home/pi/ ไปยัง /etc/init.d/


$ sudo cp /home/pi/greeting.py /etc/init.d/


ทำให้เป็น executable file


$ cd /etc/init.d/
$ sudo chmod +x greeting.py
$ sudo update-rc.d greeting.py defaults


ทางเลือกที่ 3 : การใช้ Systemd 

ข้อมูลเพิ่มเติม





ขั้นตอนที่ 1 : สร้าง service file ขึ้นมาสมมุติให้ชื่อว่า greeting.service 




$ cd /lib/systemd/system/
$ sudo nano greeting.service


พิมพ์ข้อความ


[Unit]
 Description=Test Service
 After=multi-user.target

 [Service]
 Type=idle
 ExecStart=/usr/bin/python /home/pi/greeting.py & 2>/dev/null

 [Install]
 WantedBy=multi-user.target


บันทึกแล้วเปลี่ยนคุณสมบัติของไฟล์


$ sudo chmod 644 greeting.service




ขั้นตอนที่ 2 : config service


$ sudo systemctl daemon-reload
$ sudo systemctl enable greeting.service


หากต้องการยกเลิกการใช้บริการ


$ sudo systemctl disable greeting.service

ทางเลือกที่ 4 : Crontab

เรียก crontab


$ crontab -e


เพิ่มคำสั่งลงใน crontab


@reboot sudo /usr/bin/python /home/pi/greeting.py & 2>/dev/null


กด Ctrl-X ตามด้วย y เพื่อบันทึก ทำการ reboot หากต้องการตรวจสอบใช้คำสั่ง


$ grep cron /var/log/syslog


ทั้งหมดนี้เป็นทางเลือกในการเรียกใช้โปรแกรมที่ต้องการในเวลา Startup หรือ boot time สำหรับ Raspberry Pi (ใช้กับ Ubuntu หรือ Debian ได้) แม้ในตัวอย่างผมใช้การเรียกโปรแกรมที่เขียนด้วย Python แต่ท่านก็สามารถนำหลักการไปใช้ได้โปรแกรมอื่นได้ด้วยเช่นกัน

ความคิดเห็น