我用自由BSD UNIX和它的rc
启动脚本系统使我的Node.js服务器在重新启动时作为守护进程启动,然后再次作为守护进程启动,并在我登录到我的 FreeBSD UNIX 用户帐户后使用系统给我的一些命令停止它们。
我读过了手册相关部分/etc/rc.d/my_script
和一篇关于它的文章,我分别在和中编写了以下脚本和配置/etc.rc.conf
。这使它按照我所描述的那样工作。当我为另一项服务添加另一个脚本时,只有其中一个可以工作,我认为通常是第二个。每个服务器都编码为侦听不同的端口号。
my_script_1
对于所有的人来说都是可执行的'-rwxr-xr-x'
。
/etc/rc.d/my_script_1
:
#!/bin/sh
. /etc/rc.subr
name=my_service_1
rcvar=${name}_enable
project_dir="/usr/home/ec2-user/dev/projects/my_project_1"
command="/usr/local/bin/node"
command_args="${project_dir}/index.js"
load_rc_config $name
run_rc_command "$1"
/etc.rc.conf
包括启用 var 集:
my_service_1_enable="YES"
当我添加另一个脚本和rc.conf
条目(例如名称更改为其他名称(例如 )的脚本和条目)时my_service_2
,只有其中一个有效。my_script_2
也是可执行的。
我缺少什么?我怎样才能让它们同时工作?
答案1
当你写的时候“通常”这听起来像是一个竞争条件。然后哪个实例能够生存下来是随机的。
您尝试使用 rc 脚本执行的操作没有基本问题。 rc 脚本仅启动命令。然而,您尝试启动的事情确实需要能够在多个实例中运行。 rc 系统没有做任何神奇的事情(本身)来做到这一点。
根据您的描述,我猜测项目 1 和 2 的部分使用相同的资源,因此 node.js 只能运行一个实例。一个例子是两个项目绑定到同一个端口。两个实例不能在同一端口上提供服务 - 因此只有第一个开始的实例(竞赛)才能存活。
要调试此问题,请首先确保正确处理多个实例。尝试禁用您的启动脚本。然后开始两个都同时手动进行项目。
首先你运行:
/usr/local/bin/node /usr/home/ec2-user/dev/projects/my_project_1/index.js
进而:
/usr/local/bin/node /usr/home/ec2-user/dev/projects/my_project_2/index.js
当节点输出到 STDOUT 并且错误转到 STDERR 时,更容易看出出了什么问题。我非常确定您的问题就在这里,并且输出可以帮助您进一步调查。
如果上述确实有效(与我的怀疑相反),那么您需要从启动脚本中的启动节点进程获取日志输出。 Node.js 似乎没有记录到文件或系统日志中。这意味着如果您尝试手动启动 rc 脚本,您应该会在屏幕上看到错误输出。因此,尝试使用以下命令控制 rc 脚本:
service my_service_1 start
要进一步了解日志记录,请查看nodejs 日志文件在哪里。
笔记:您正在使用自己的脚本,/etc/rc.d/your_script
其中的脚本适用于基本系统。您应该将脚本放入/usr/local/etc/rc.d/your_script
.该service
命令搜索两个位置,因此其工作方式相同。两者都不需要改变/etc/rc.conf
。