Javascript 如何在Raspberry Pi上执行Node.js应用程序中的shutdown命令
我有一个运行简单NodeJS应用程序的无头Raspberry Pi 我连接到Pi的唯一界面是一个启动和停止timelapse视频录制的按钮 我知道在没有正确关机的情况下切断Pi的电源不是一个好的做法,所以我想向节点添加一个关机命令 使用ShellJS,我可以非常简单地做到这一点——如果用户按住按钮五秒钟,我就可以调用Javascript 如何在Raspberry Pi上执行Node.js应用程序中的shutdown命令,javascript,linux,node.js,raspberry-pi,Javascript,Linux,Node.js,Raspberry Pi,我有一个运行简单NodeJS应用程序的无头Raspberry Pi 我连接到Pi的唯一界面是一个启动和停止timelapse视频录制的按钮 我知道在没有正确关机的情况下切断Pi的电源不是一个好的做法,所以我想向节点添加一个关机命令 使用ShellJS,我可以非常简单地做到这一点——如果用户按住按钮五秒钟,我就可以调用 shell.exec('sudo shutdown -h now'); 这将关闭Pi。当我通过ssh连接到Pi并且我自己调用node命令('node app.js')时,这就像预
shell.exec('sudo shutdown -h now');
这将关闭Pi。当我通过ssh连接到Pi并且我自己调用node命令('node app.js')时,这就像预期的那样工作。但我的目标是让我的节点应用程序在启动时自动运行。我使用“/etc/rc.local”在启动时调用脚本:
su pi -c 'node /path/to/app.js'
在这种情况下,shutdown命令不起作用,我甚至不知道如何访问节点控制台来查看它抛出了什么样的错误。有人能给我指出正确的方向吗?当您从
/etc/rc.local
启动进程时,这些进程将使用有限的$PATH
变量启动(变量$PATH
包含一个目录列表,在其中可以找到可执行程序,因此您不必使用这些程序的完整路径启动这些程序;只需使用它们的名称即可)
这通常不包含系统二进制文件的路径,如shutdown
,可在/sbin
中找到
您的登录shell很可能会将这些系统路径添加到$PATH
,这就是为什么从命令行启动节点应用程序时,关闭可执行文件工作正常的原因
但是,当从/etc/rc.local
启动同一节点应用程序时,在$PATH
中的任何目录中都找不到关机可执行文件,尝试执行它将导致错误
您可以通过使用关闭可执行文件的完整路径或通过在/etc/rc.local
中增加$path
变量来解决此问题:
# /etc/rc.local
export PATH=/sbin:/usr/sbin:$PATH
su pi -c 'node /path/to/app.js'
当您从
/etc/rc.local
启动进程时,这些进程将使用有限的$PATH
变量启动($PATH
变量包含查找可执行程序的目录列表,因此您不必使用这些程序的完整路径启动这些程序;相反,只需使用它们的名称即可)
这通常不包含系统二进制文件的路径,如shutdown
,可在/sbin
中找到
您的登录shell很可能会将这些系统路径添加到$PATH
,这就是为什么从命令行启动节点应用程序时,关闭可执行文件工作正常的原因
但是,当从/etc/rc.local
启动同一节点应用程序时,在$PATH
中的任何目录中都找不到关机可执行文件,尝试执行它将导致错误
您可以通过使用关闭可执行文件的完整路径或通过在/etc/rc.local
中增加$path
变量来解决此问题:
# /etc/rc.local
export PATH=/sbin:/usr/sbin:$PATH
su pi -c 'node /path/to/app.js'
pi
用户是否有sudo priv?另外,这可能是一个$PATH
问题,请尝试使用sudo
和shutdown
的完整路径。这会更好,谢谢。但是你能解释一下为什么吗?因为我正在学习Linux,我很想了解何时以及为什么我需要为命令提供完整路径。p我
用户有sudo priv?另外,这可能是一个$PATH
问题,请尝试使用sudo
和shutdown
的完整路径。这会更好,谢谢。但是你能解释一下为什么吗?因为我正在学习Linux,我很想了解何时以及为什么我需要为命令提供完整路径。