樹莓派程式開機自啟動方法總結
剛上手樹莓派,也因此接觸Linux,對Linux系統很多機制都不熟悉,先前想把自己寫的一個程式隨樹莓派開機啟動,搜尋並嘗試了網上各種方法,經過一番折騰,總結了四種實現開機自啟動的方法。
製作測試指令碼
首先我們需要製作一個指令碼來測試自啟動是否有效。在終端下輸入並回車新建指令碼檔案testboot.sh
[email protected]:~ $ nano testboot.sh
testboot.sh檔案內容如下:
#!/bin/sh
touch /home/pi/testboot.txt
chmod 777 /home/pi/testboot.txt
echo "hello pi~" >> /home/pi/testboot.txt
測試指令碼將列印字串到檔案中。按ctrl+o儲存檔案,再按ctrl+x退出編輯器。
給指令碼檔案新增執行許可權:
[email protected]:~ $ chmod 777 testboot.sh
測試一下指令碼功能:
[email protected]:~ $ ./testboot.sh
執行正常的話會在當前目錄(pi)生成一個testboot.txt的文字檔案。顯示檔案內容:
[email protected]:~ $ cat testboot.txt
新增自啟動
方法一:向rc.local檔案新增啟動程式碼
修改rc.local檔案,在終端輸入並回車:
:~ $ sudo nano /etc/rc.local
在開啟的文字中找到exit 0,在此之前新增的程式碼在啟動時都會被執行,在exit 0 之前新增一行程式碼:
su pi -c "exec /home/pi/testboot.sh"
ctrl+o儲存,ctrl+x退出,然後在終端輸入:sudo reboot ,重啟系統測試。
su命令是指定在pi使用者下執行這條命令,-c 表示執行完這條命令之後恢復原來的使用者。
注意:系統啟動時在執行這段程式碼時是使用root使用者許可權的,如果不指定pi使用者,可能會因為許可權問題導致指令碼執行失敗。
方法二:將程式作為服務啟動
在/etc/init.d/目錄下新建一個服務指令碼檔案。在終端輸入並回車
[email protected]:~ $ sudo nano /etc/init.d/testboot
在空白檔案中輸入以下內容:
#!/bin/sh
#/etc/init.d/testboot
### BEGIN INIT INFO
# Provides:testboot
# Required-Start:$remote_fs $syslog
# Required-Stop:$remote_fs $syslog
# Default-Start:2 3 4 5
# Default-Stop:0 1 6
# Short-Description: testboot
# Description: This service is used to start my applaction
### END INIT INFO
case "$1" in
start)
echo "start your app here."
su pi -c "exec ~/testboot.sh"
;;
stop)
echo "stop your app here."
;;
*)
echo "Usage: service testboot start|stop"
exit 1
;;
esac
exit 0
ctrl+o儲存,ctrl+x退出。
設定指令碼可執行許可權:
[email protected]:~ $ sudo chmod 777 /etc/init.d/testboot
最後將該指令碼作為服務設定開機自動載入:
[email protected]:~ $ sudo update-rc.d testboot defaults
sudo reboot 重啟測試。
方法三:通過桌面啟動
此方法是在載入了桌面後再啟動我們自定義的程式,因此需要安裝帶有桌面的版本,如果不是請跳過。
在/home/pi/.config/目錄下新建一個名為 autostart 的資料夾:
[email protected]:~ $ mkdir .config/autostart
在 autostart 目錄下新建testboot.desktop (經測試名字任意,但字尾必須是.desktop):
[email protected]:~ $ nano .config/autostart/testboot.desktop
檔案內容如下:
[Desktop Entry]
Type=Application
Name=testboot
NoDisplay=true
Exec=/home/pi/testboot.sh
sudo reboot 重啟測試。
注意:這個方法除了依賴桌面之外,如果開啟了多個桌面則會導致自定義的程式多次啟動。比如系統啟動桌面會呼叫一次testboot.sh指令碼,如果再用遠端桌面登入到樹莓派,指令碼會再執行一次。
方法四:使用systemctl設定服務
在/usr/lib/systemd/system/ 下新建檔案testboot.service:
[email protected]:~ $ sudo nano /usr/lib/systemd/system/testboot.service
如果目錄system不存在,請自行建立:
[email protected]:~ $ sudo mkdir /usr/lib/systemd/system
testboot.service檔案內容如下:
[Unit]
Description=testboot
[Service]
Type=oneshot
ExecStart=/home/pi/testboot.sh
[Install]
WantedBy=multi-user.target
這裡直接指定啟動檔案的路徑,無法指定到pi使用者執行,所以只能在root使用者下執行。
設定服務自啟動:
[email protected]raspberry:~ $ sudo systemctl enable testboot.service
注意:這個方法與方法二類似都是通過服務啟動,所以如果兩種方法同時使用要注意不能使用同個服務名。
總結
除了通過桌面啟動以外,其他方式在執行啟動程式碼的時候都是用root使用者在執行的,所以需要特別注意許可權的問題,最好就全部都指定到pi使用者去執行。除了可以執行指令碼之外,也可以啟動自己寫的程式或者python指令碼,需要注意的是如果自啟動的程式有依賴於其他服務則必須等待其他服務載入完畢才能正常啟動,保險的做法延時後再啟動。