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

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

我已经连接到Pi的唯一的接口是一个单一的button,启动和停止一个timelapsevideo录制。

我知道在没有正确closures的情况下切断Pi电源并不是一个好习惯,所以我想给Node节点添加一个closures命令。

使用ShellJS,我可以很简单地做到这一点 – 如果用户按住button五秒钟,我可以打电话

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

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

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

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

当你从/etc/rc.local启动进程时,这些进程将以一个有限的$PATHvariables启动( $PATHvariables包含一个查找可执行程序的目录列表,所以你不必使用这些程序来启动这些程序他们的完整path;相反,只是他们的名字就足够了)。

这通常不包含系统二进制文件的path,如shutdown ,可以在/sbinfind。

您的loginshell最有可能将这些系统path添加到$PATH ,这就是为什么当从命令行启动您的Node应用程序时,closures可执行文件工作得很好。

但是,当从/etc/rc.local启动相同的Node应用程序时,无法在$PATH中的任何目录中findclosures可执行文件,尝试执行它将导致错误。

您可以通过使用closures可执行文件的完整path来解决这个问题,也可以通过在/etc/rc.local增加$PATHvariables来解决这个问题:

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