백그라운드 프로세스를 시작하는 올바른 방법

백그라운드 프로세스를 시작하는 올바른 방법

SSH 세션의 원격 시스템에서 기본 node.js 서버를 시작하고 싶습니다. 이것은 작동하는 것 같습니다:

nohup node server/server.js &  disown

어쩌면 nohup이 필요하지 않을까요? SIGTERM 등에 의해 종료되지 않는 백그라운드 프로세스를 시작하는 "공식적인" 방법은 무엇입니까? 백그라운드 프로세스를 시작한 다음 세션을 종료하고 프로세스를 계속 실행하고 싶습니다.

답변1

screen물론입니다 tmux. 하지만 연결을 끊었다가 다시 연결하려는 대화형 세션(일반적으로 원격 시스템)을 위한 것입니다. 귀하의 애플리케이션은 일종의 서버인 것 같으므로 시스템 서비스(보통 '악마") 그 반대입니다.

다음에서는 사용 중인 시스템이 다음과 같다고 가정합니다.체계. 다음 위치에 유닛 파일을 생성하기만 하면 됩니다 /etc/systemd/system/foo.service.

[Unit]
Description=My foo service
After=network.target

[Service]
ExecStart=/usr/bin/node /absolute/path/to/your/server.js
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target

서비스가 디스크의 파일에 액세스해야 하는 경우 필요에 따라 사용자를 수정하십시오. 서비스 파일이 준비되면 다음 명령을 실행하여 systemd에 구성 파일을 다시 로드하고 서비스를 실행하도록 요청합니다.

$ sudo systemctl daemon-reload
$ sudo systemctl start foo.service

시스템이 시작될 때 자동으로 시작하시겠습니까? 그냥 활성화하세요:

$ sudo systemctl enable foo.service

문제가 발생했나요? 다음 명령을 사용하여 문제를 해결할 수 있습니다.

$ systemctl status foo.service
$ journalctl -u foo.service

서비스 종료/해지 방지에 대한 귀하의 요청에 대해: 아무리 말씀드리더라도 매우 어려울 것 같습니다. 사용자가 애플리케이션을 종료할 수 있는 권한이 없더라도 시스템에 RAM이 부족할 수 있으며, RAM을 가장 많이 사용하는 서비스이기 때문에 Out of Memory Killer가 서비스를 종료하기로 결정할 수도 있습니다. 내 제안은 Restart=always위의 예에 포함된 내용을 사용하여 systemd가 충돌/종료 시 서비스를 다시 시작하도록 하는 것입니다.

답변2

나중에 액세스할 수 있도록 screen 명령을 사용하여 터미널 세션을 저장할 수 있습니다. 이렇게 하면 터미널 세션에 연결될 수 있는 프로세스를 종료하지 않아도 됩니다. 따라서 이는 대량의 데이터 전송을 시작하려는 경우 유용한 예입니다. screen 세션을 시작하고 데이터 전송을 시작한 후 집에 가서 SSH를 통해 직장 컴퓨터로 다시 돌아간 다음 전송을 중단하지 않고 screen 세션에 액세스할 수 있습니다.

설치하려면:

sudo apt install screen Ubuntu 또는 Ubuntu 변형에 사용 가능

yum install screenRedhat 또는 Redhat 변형

그럼 당신은 실행할 수 있습니다

screen -S <screen name>새 화면 세션 만들기

screen -ls화면 세션 나열

screen -r <screen name>특정 화면에 첨부합니다.

tmux는 screen 명령을 천천히 대체하고 있으므로, 그것도 살펴보는 것이 좋습니다.

답변3

완전성과 후손을 위해 가장 간단하고 명확한 답변을 추가하면 됩니다(여기서 유일한 차이점은폐쇄stdin, 그렇지 않으면 다음을 포함하여 질문의 예와 동일합니다.표준 출력/표준 입력 리디렉션통사론):

(1) stderr 및 stdout에 관심이 없는 경우:

$ nohup {prog} </dev/null >/dev/null 2>&1 &  

(2) stderr, stdout을 로그하고 싶다면,

$ nohup {prog} </dev/null >/path/to/out.log 2>&1 &  

(3) stderr과 stdout을 별도의 파일에 기록하고 싶다면,

$ nohup {prog} </dev/null >/path/to/out.log 2>/path/to/err.log &

로그를 유지하려면 부팅할 때마다 예제를 덮어쓰세요. 예를 들어 해당 경로를 따라 가기 시작하면 날짜로 로그 이름을 지정하는 옵션이 있지만 out-$(date '+%Y-%m-%d-%H:%M:%S').log다른 답변에서 볼 수 있듯이 서비스를 구성하고 시스템이 작업을 수행하도록 하는 것이 좋습니다. 나는 screen/ 를 좋아 tmux하지만 실제로 터미널에 다시 연결하려는 프로세스를 디버깅하는 경우에만 가능합니다. 그렇지 않으면 백그라운드 프로세스와 로깅을 선호합니다.

관련 정보