rc를 통해 동일한 실행 파일이 포함된 두 개의 데몬을 함께 실행하고 관리합니다.

rc를 통해 동일한 실행 파일이 포함된 두 개의 데몬을 함께 실행하고 관리합니다.

나는 사용한다무료 BSD 유닉스그리고 그것의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.confvar 세트 활성화 포함:

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.

관련 정보