สมมุติว่าผมทำโปรแกรมให้ 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
ข้อมูลเพิ่มเติม- http://raspberrypi.stackexchange.com/questions/45358/start-python-script-at-startup-using-systemd-in-rpi-jessie
- https://learn.adafruit.com/running-programs-automatically-on-your-tiny-computer/systemd-writing-and-enabling-a-service
- https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=91367
- http://www.raspberrypi-spy.co.uk/2015/10/how-to-autorun-a-python-script-on-boot-using-systemd/
- http://neilwebber.com/notes/2016/02/10/making-a-simple-systemd-file-for-raspberry-pi-jessie/
ขั้นตอนที่ 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 แต่ท่านก็สามารถนำหลักการไปใช้ได้โปรแกรมอื่นได้ด้วยเช่นกัน
Sign up here with your email
1 ความคิดเห็น:
Write ความคิดเห็นขอบคุณครับ สำหรับการแบ่งปันเวลา และ ความรู้มาให้ครับ
ReplyConversionConversion EmoticonEmoticon