나는 사용한다무료 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.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
.