在上一篇 树莓派 自启动连接阿里云物联网平台(一) 中,我们讲了 "树莓派 连接阿里云物联网平台" 的部分,这一篇我们讲如何使 aliyun_iot_device_quickstart
的脚本程序实现开机自启动上报数据到阿里云物联网平台。
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
上——它们都是使用的相对路径。
start.sh
./node_modules
" 修改为 node_modules 的绝对路径 :$(cd `dirname $0`; pwd)"/node_modules"
./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 的就是查询进程。
再查看"阿里云物联网平台‘‘,就可以看到设备在线并上报数据:
原文:https://www.cnblogs.com/Yogile/p/12458790.html