一、前言
在上一篇 樹莓派 自啟動連接阿里雲物聯網平台(一) 中,我們講了 "樹莓派 連接阿里雲物聯網平台" 的部分,這一篇我們講如何使 aliyun_iot_device_quickstart 的腳本程序實現開機自啟動上報數據到阿里雲物聯網平台。
二、修改啟動腳本文件
1. 查看啟動腳本文件
- 如果你嘗試在
aliyun_iot_device_quickstart文件夾外(例:/home/pi),調用該文件夾下的start.sh文件,你就會發現在/home/pi文件夾下出現package-lock.json文件並報錯:
pi@raspberrypi:/home/pi $ sudo vim /usr/local/Extension/aliyun_iot_device_quickstart/start.sh
...
...
Error: Cannot find module '/home/pi/index.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
at Function.Module._load (internal/modules/cjs/loader.js:507:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
-
這個時候,如果直接將這個
start.sh腳本文件設置為自啟動,在下次開機時是不會運行的。因為執行自啟動的目錄同樣不是start.sh的父目錄。 -
使用
sudo vim ./start.sh在aliyun_iot_device_quickstart目錄下打開腳本文件,顯示:
set -e
if [ ! -d ./node_modules ]; then
printf "Installing Aliyun Iot Device SDK...\n"
npm install
fi
node ./index.js
-
可以看出
start.sh只能在aliyun_iot_device_quickstart目錄下運行的原因,出在: -
第 3 行的
./node_modules和第 8 行的./index.js上——它們都是使用的相對路徑。
2. 修改啟動腳本文件 start.sh
- /將第 3 行 "
./node_modules" 修改為 node_modules 的絕對路徑 :
$(cd `dirname $0`; pwd)"/node_modules"
- 將第 8 行 "
./index.js" 修改為 index.js 的絕對路徑:
$(cd `dirname $0`; pwd)"/index.js"
- 修改結束的內容:
set -e
if [ ! -d $(cd `dirname $0`; pwd)"/node_modules" ]; then
printf "Installing Aliyun Iot Device SDK...\n"
npm install
fi
node $(cd `dirname $0`; pwd)"/index.js"
三、設置腳本自啟動
請閱讀我的另一篇博客 樹莓派 腳本程序自啟動 ,實現腳本程序自啟動。
四、重啟測試
輸入 sudo reboot 重啟,觀察得:
-
輸入
ps -nux | grep index查詢含有index字符的進程:pi@raspberrypi:/usr/local/Extension/aliyun_iot_device_quickstart $ ps -aux | grep index root 2035 22.4 1.9 155876 38892 pts/1 Sl+ 13:17 0:02 node /usr/local/Extension/aliyun_iot_device_quickstart/index.js pi 2049 0.0 0.0 7348 576 pts/0 S+ 13:17 0:00 grep --color=auto index其中,root 權限、PID 為 2035 的進程就是自啟動
aliyun_iot_device_quickstart下的主程序,pi 權限、PID 為 2049 的就是查詢進程。 -
再查看"阿里雲物聯網平台'',就可以看到設備在線並上報數據:

