วิธีเรียกใช้โปรแกรมในเวลา 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." 2>/dev/null'
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 แต่ท่านก็สามารถนำหลักการไปใช้ได้โปรแกรมอื่นได้ด้วยเช่นกัน

Previous
Next Post »

1 ความคิดเห็น:

Write ความคิดเห็น
Unknown
AUTHOR
5 กุมภาพันธ์ 2560 เวลา 10:54 delete

ขอบคุณครับ สำหรับการแบ่งปันเวลา และ ความรู้มาให้ครับ

Reply
avatar