通过 rc 一起运行和管理具有相同可执行文件的两个守护进程

通过 rc 一起运行和管理具有相同可执行文件的两个守护进程

我用自由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

相关内容