一、前言
在上一篇 树莓派 自启动连接阿里云物联网平台(一) 中,我们讲了 "树莓派 连接阿里云物联网平台" 的部分,这一篇我们讲如何使 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...
"
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...
"
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 的就是查询进程。 -
再查看"阿里云物联网平台'',就可以看到设备在线并上报数据: