如何在系统启动时启动 Node.js 应用程序?
Posted
技术标签:
【中文标题】如何在系统启动时启动 Node.js 应用程序?【英文标题】:How to start a Node.js app on system boot? 【发布时间】:2014-02-27 19:42:38 【问题描述】:我正在开发一个运行 Raspbian 并运行 Node.js 应用程序的 Raspberry Pi,并尝试在 Pi 启动时启动它。我找到了几个例子,但我似乎无法让它工作。我当前的代码是:
#! /bin/sh
# /etc/init.d/MyApp
### BEGIN INIT INFO
# Provides: MyApp.js
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts MyApp.js
# Description: Start / stop MyApp.js at boot / shutdown.
### END INIT INFO
# If you want a command to always run, put it here
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting MyApp.js"
# run application you want to start
node /home/pi/app/MyApp/MyApp.js
;;
stop)
echo "Stopping MyApp.js"
# kill application you want to stop
killall MyApp.js
;;
*)
echo "Usage: /etc/init.d/MyApp start|stop"
exit 1
;;
esac
exit 0
我在 etc/init.d 文件夹中有这个,运行 chmod +x /etc/init.d/MyApp
,我可以手动运行它,然后运行 sudo update-rc.d MyApp defaults
,重新启动,脚本永远不会运行。我查看了一些不同的示例,进行了调整,但仍然没有运气。
【问题讨论】:
【参考方案1】:我通过首先检查 node.js 在 RaspberryPi 上的安装位置解决了这个问题:
which node
这给了我:
/usr/local/bin/node
打开 crontab 配置:
sudo crontab -e
然后在我的 crontab 中:
@reboot sudo /usr/local/bin/node <complete path to your .js app> &
保存,重启,问题解决!
【讨论】:
愚蠢的问题:>> &
是做什么的?它给我抛出了一个错误。
@JeffThompson,>> 是一个错字。省略尖括号。【参考方案2】:
Mohit 是对的,但为了澄清起见,您可以使用 readlink 来查找 Node.js 应用程序的完整路径,因为稍后需要将其添加为 cron 作业。
readlink -f <<name of file >>
例如readlink -f HAP-NodeJS/Core.js
的结果是/home/pi/HAP-NodeJS/Core.js
您也可以使用which node
查找node.js 的安装完整路径
接下来,使用sudo crontab -e
创建一个新的 cron 作业,并在最后添加以下代码:
@reboot sudo /usr/local/bin/node <<.js application path>> &
例如,我的代码如下所示。
@reboot sudo /usr/local/bin/node /home/pi/HAP-NodeJS/Core.js &
重启(或启动)后,您的 Node.js 应该会运行。希望这能解决问题。
【讨论】:
感谢您详细解答! 它对我不起作用,我做了完全相同的事情。我正在使用 xrdp 远程工作它有什么影响吗?【参考方案3】:如果您使用像 0.10.24 这样的预构建 Pi 版本,您可能会遇到 PATH 问题。
您可以提供节点二进制文件的完整路径作为start
命令的一部分,或者确保在运行/etc/init.d/MyApp
之前设置节点二进制文件的路径。我遇到了同样的问题,并且都尝试了成功。此外,您拥有的 stop
命令可能无法正常工作。
#! /bin/sh
# /etc/init.d/test
### BEGIN INIT INFO
# Provides: test
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Example initscript
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting test.js"
# run application you want to start
#node /home/pi/test.js > /home/pi/test.log
/home/pi/downloads/node-v0.10.24-linux-arm-pi/bin/node /home/pi/test.js >> /home/pi/test.log
;;
stop)
echo "Stopping test.js"
# kill application you want to stop
killall -9 node
# Not a great approach for running
# multiple node instances
;;
*)
echo "Usage: /etc/init.d/test start|stop"
exit 1
;;
esac
exit 0
如果您想做sudo node
,您可以使用sudo visudo
将路径添加到Defaults secure_path
。
另外,我建议使用 forever 之类的东西来让您的进程在崩溃后保持运行,等等。
【讨论】:
我尝试按照建议将完整路径添加到二进制文件中,但结果相同。我可以手动启动它,但它不会在启动时启动。进行更改后,我运行chmod +x /etc/init.d/MyApp
并删除并重新添加到 rc.d。我的计划是在我可以让它在启动时触发之后永远使用它。
当你尝试手动启动它时,你是在做 sudo /etc/init.d/MyApp start?这就是我确定我遇到 PATH 问题的方式。
正确。我打电话给sudo /etc/init.d/MyApp start
。
嗯...这很奇怪。您也可以以 root 身份执行节点应用程序吗?它是保持运行的应用程序,例如 Web 服务器吗?您是否尝试像我的示例中使用> test.log
将输出通过管道传输到日志并检查日志?我无法从/var/log
的任何文件中找到问题的日志,但也许我错过了。我不确定Provides: MyApp.js
是否是问题所在,但您可能想尝试Provides: MyApp
。
哦,我刚刚意识到 >> 在这种情况下比 > 更好,因为它会附加到日志而不是开始新的日志。这可以解释你所说的覆盖场景。以上是关于如何在系统启动时启动 Node.js 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章