如何从 Raspberry Pi 上的 Node.js 应用程序执行关机命令

How to execute shutdown command from Node.js app on Raspberry Pi

我有一个无头 Raspberry Pi 运行 一个简单的 NodeJS 应用程序。

我连接到 Pi 的唯一接口是一个按钮,可以启动和停止延时视频录制。

我知道在没有正确关机的情况下切断 Pi 的电源不是好的做法,所以我想向 Node 添加一个关机命令。

使用 ShellJS,我可以非常简单地做到这一点 - 如果用户按住按钮五秒钟,我可以调用

shell.exec('sudo shutdown -h now');

这将关闭 Pi。当我通过 ssh 连接到 Pi 并且我自己调用节点命令时,这按预期工作 ('node app.js')。但我的目标是让我的 Node 应用 运行 在启动时自动运行。我通过使用 '/etc/rc.local' 在启动时调用脚本来做到这一点:

su pi -c 'node /path/to/app.js'

在这种情况下,关闭命令不起作用,我什至不知道如何访问节点控制台以查看它抛出的错误类型。有人可以在这里为我指明正确的方向吗?

当您从 /etc/rc.local 启动进程时,这些进程将以有限的 $PATH 变量启动($PATH 变量包含可在其中查找可执行程序的目录列表,因此您不必使用完整路径启动这些程序;相反,只需使用它们的名称即可)。

这通常不包含系统二进制文件的路径,例如 shutdown,可以在 /sbin.

中找到

您的登录 shell 很可能会将这些系统路径添加到 $PATH,这就是为什么从命令行启动 Node 应用程序时,关闭可执行文件工作正常的原因。

但是当从/etc/rc.local启动同一个Node应用程序时,在$PATH的任何目录中都找不到关闭可执行文件,尝试执行它会导致错误.

您可以通过使用关闭可执行文件的完整路径或增加 /etc/rc.local 中的 $PATH 变量来解决此问题:

# /etc/rc.local
export PATH=/sbin:/usr/sbin:$PATH
su pi -c 'node /path/to/app.js'