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 screen
Redhat 또는 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
하지만 실제로 터미널에 다시 연결하려는 프로세스를 디버깅하는 경우에만 가능합니다. 그렇지 않으면 백그라운드 프로세스와 로깅을 선호합니다.