http://www.lxweimin.com/p/86adb6d5347b自動啟動教程
剛上手樹莓派,也因此接觸Linux,對Linux系統很多機制都不熟悉,先前想把自己寫的一個程序隨樹莓派開機啟動,搜尋并嘗試了網上各種方法,經過一番折騰,總結了四種實現開機自啟動的方法。 制作測試腳本 首先我們需要制作一個腳本來測試自啟動是否有效。在終端下輸入并回車新建腳本文件testboot.sh pi@raspberry:~ $ 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退出編輯器。 給腳本文件添加執行權限: pi@raspberry:~ $ chmod 777 testboot.sh 測試一下腳本功能: pi@raspberry:~ $ ./testboot.sh 執行正常的話會在當前目錄(pi)生成一個testboot.txt的文本文件。顯示文件內容: pi@raspberry:~ $ cat testboot.txt 添加自啟動 方法一:向rc.local文件添加啟動代碼 修改rc.local文件,在終端輸入并回車: pi@raspberry:~ $ 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/目錄下新建一個服務腳本文件。在終端輸入并回車 pi@raspberry:~ $ 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退出。 設置腳本可執行權限: pi@raspberry:~ $ sudo chmod 777 /etc/init.d/testboot 最后將該腳本作為服務設置開機自動加載: pi@raspberry:~ $ sudo update-rc.d testboot defaults sudo reboot 重啟測試。 方法三:通過桌面啟動 此方法是在加載了桌面后再啟動我們自定義的程序,因此需要安裝帶有桌面的版本,如果不是請跳過。 在/home/pi/.config/目錄下新建一個名為 autostart 的文件夾: pi@raspberry:~ $ mkdir .config/autostart 在 autostart 目錄下新建testboot.desktop (經測試名字任意,但后綴必須是.desktop): pi@raspberry:~ $ 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: pi@raspberry:~ $ sudo nano /usr/lib/systemd/system/testboot.service 如果目錄system不存在,請自行創建: pi@raspberry:~ $ 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用戶下執行。 設置服務自啟動: pi@raspberry:~ $ sudo systemctl enable testboot.service 注意:這個方法與方法二類似都是通過服務啟動,所以如果兩種方法同時使用要注意不能使用同個服務名。 總結 除了通過桌面啟動以外,其他方式在執行啟動代碼的時候都是用root用戶在執行的,所以需要特別注意權限的問題,最好就全部都指定到pi用戶去執行。除了可以執行腳本之外,也可以啟動自己寫的程序或者python腳本,需要注意的是如果自啟動的程序有依賴于其他服務則必須等待其他服務加載完畢才能正常啟動,保險的做法延時后再啟動。 作者:oldfool 鏈接:http://www.lxweimin.com/p/86adb6d5347b 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處