希望將自己的application在樹莓派(Raspberry Pi ),做成開機自動運行,進行了一些實踐,如下:
測試環境:樹莓派,管理員:root,普通用戶:haochuang
實現目標:在Linux啟動時,自動運行位於普通用戶haochuang根目錄下的腳本程序osprey,該程序會在每次執行時自動向本地日志文件追加一條記錄,源碼如下:
1. 准備好相應的 application
#!/bin/sh ### BEGIN INIT INFO # Provides: osprey # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Required-Start: $local_fs # Required-Stop: # chkconfig: 12345 99 05 # Short-Description: Start or stop the Osprey App. ### END INIT INFO start(){ echo -n "start osprey" cd /home/lifeccp/webapp/osprey su haochuang -c "java -jar osprey-*.jar --spring.profiles.active=test &" } stop(){ echo -n "stop osprey" } case $1 in start) start ;; stop) stop ;; *) echo "Usage: $0 (start|stop)" ;; esac
2.為程序增加可執行權限,並將程序放到 /etc/init.d/
mv osprey /etc/init.d/
chmod +r /etc/init.d/osprey
3.安裝chkconfig
sudo apt-get install chkconfig

如果安裝失敗,則使用下面命令再次嘗試:
sudo apt-get install chkconfig --fix-missing
4.運行chkconfig --add osprey, 把該服務添加到配置當中
5.運行chkconfig --list osprey,可以查看該服務進程的狀態
6.完了之后,reboot一下,並查看進程,進行驗證;
由於我增加了兩個服務,結果截圖如下:

補充1,方案的解釋:
切換用戶到haochuang,然后執行命令啟動應用程序;
su haochuang --切換到相應用戶 cd /home/haochuang --切換到根目錄 java -jar osprey-1.0.4.jar --spring.profiles.active=test & --執行應用程序 exit --退出帳號
做成服務的好處是可以定義多個交互命令,比如:start,stop,restart,reset...,在服務運行的過程中還可以做相應操作。
看起來好象一切都沒錯,但是發現只運行了第一行的命令,后面的都沒有運行,直到退出lifeccp用戶后才發現好象執行完畢。
分析原因,是因為Linux啟動的時候是在root帳號下,執行su lifeccp等於打開了一個新的shell腳本,因此下面的代碼都在等着新的Shell腳本結束才能運行,就象在主程序里調用了一個子程序,而子程序是個死循環,一下出來來結果下面的要等死了。
在執行上述腳本程序時,不要離開本身的Shell。我們可以把執行命令做為su的一個參數傳遞進去,因為沒有涉及到打開新的Shell,因此可以正常執行你期望的腳本程序,順利實現開機自動啟動指定的腳本程序。
補充2,如果執行 sudo apt-get install chkconfig 一直報錯,安裝不成功,那么需要檢查如下幾點:
- 檢查設備網絡情況是否正常,確保設備網絡本身可通達內外網;
- 更新一下系統配置:sudo apt-get update
然后再次重試。
如果有問題,請參考另一篇新的:【樹莓派】在樹莓派上制作開機自啟動程序及服務2
