我使用FreeBSD UNIX及其启动脚本的远程控制系统使我的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也是可执行的。
我遗漏了什么?我怎么能让他们两者兼得呢?
发布于 2018-10-20 07:43:33
当您编写时,“通常”听起来像是一种竞赛条件。然后是随机的哪一个实例才能生存下来。
在您尝试使用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日志到一个文件或syslog。这意味着,如果您试图手动启动rc脚本,您应该将错误输出到屏幕上。因此,尝试使用以下方法控制您的rc脚本:
service my_service_1 start要进一步了解日志记录,请看一下nodejs-日志文件在哪里?。
注意:您正在/etc/rc.d/your_script中使用您自己的脚本,这是针对基本系统的。您应该将脚本放在/usr/local/etc/rc.d/your_script中。service命令搜索这两个位置,因此它的工作原理是一样的。也没有与/etc/rc.conf相关联的更改。
https://unix.stackexchange.com/questions/476589
复制相似问题