Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Raspberry Pi上执行Node.js应用程序中的shutdown命令_Javascript_Linux_Node.js_Raspberry Pi - Fatal编程技术网

Javascript 如何在Raspberry Pi上执行Node.js应用程序中的shutdown命令

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')时,这就像预

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

我连接到Pi的唯一界面是一个启动和停止timelapse视频录制的按钮

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

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

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,我很想了解何时以及为什么我需要为命令提供完整路径。