PuTTY 또는 터미널이 닫힌 후에도 프로세스가 계속 실행됩니다.

PuTTY 또는 터미널이 닫힌 후에도 프로세스가 계속 실행됩니다.

나는Node.js서버가 Raspbian(Debian) 시스템에 있고 서버를 원격으로 시작하고 중지하고 싶습니다. 이것이 나에게 의미하는 바는 다음과 같습니다.퍼티PuTTY 터미널을 닫거나 시간 제한을 초과하지 않는 한 셸에 액세스하면 서버가 포그라운드에서 실행 중이므로 서버도 함께 종료됩니다.

계속 진행하지만 나중에 프로세스를 종료할 수 있는 방법이 있습니까?

답변1

나는 raspbian에 대해 모르지만 Debian에서 파생되었으므로 nohup도 사용할 수 있을 것이라고 가정합니다. 프로세스를 실행하는 대신,

$  proc &

다음을 사용해 보세요:

$ nohup proc &

nohup은 터미널 연결이 끊어졌을 때 프로세스가 종료되는 것을 방지합니다. HTH.

답변2

귀하의 질문에는 세부 사항이 약간 부족하므로 Pi 콘솔에서 서버를 시작하는 명령을 입력했고 포그라운드에서 실행되었다는 뜻이라고 가정합니다.

이 경우 구현의 복잡성에 따라 다섯 가지 옵션이 있습니다.

  1. 사용@f-Tasser의 답변. GNU/Linux를 처음 사용하는 경우 이 &기호는 일반적으로 수행하는 작업(즉, 프롬프트로 돌아가기 전에 명령이 완료될 때까지 기다리는 것)이 아닌 백그라운드에서 프로세스를 실행하고 즉시 프롬프트로 돌아가야 함을 쉘에 알려줍니다. . 기술적으로 이는 명령을 백그라운드로 포크하는 것입니다.

  2. 이전에 수행한 작업을 단계별로 수행합니다 screen. 기본적으로 이 명령 screen은 Debian 시스템에 설치 sudo apt-get install screen한 다음 서버를 시작하는 명령을 입력하기 전에 실행 해야 합니다 screen. 이렇게 하면 PuTTY 연결이 이런 방식으로 중단되더라도 나중에 다시 연결할 수 있는 새 셸이 열립니다. 따라서 연결이 끊어지지 않은 것처럼 작동합니다.

    잘 모르신다면 screen읽어보시면 좋을 것 같아요위키피디아그리고맨페이지에서. 를 사용하여 동일한 작업을 수행할 수도 있습니다 tmux.

  3. 사용영원히Node.js 모듈. 바라보다https://stackoverflow.com/questions/4797050/how-to-run-process-as-Background-and-never-die나는 이것을 어디서 얻었습니까?

  4. 서버를 screen백그라운드 프로세스에 두십시오. 즉, screen백그라운드에서 새 세션을 생성하지만 연결하지는 않습니다. 또한 화면 프로세스는 쉘을 실행하는 대신 서버를 실행합니다. 다음을 입력합니다:

    screen -d -m exec_your_server --put-args-here
    

    원하는 경우 시작 시 실행할 수 있습니다. 기본적으로 화면 명령을 파일 /etc/rc.local또는 에 넣어야 하는데 /etc/rc.d/rc.local어느 것인지 잊어버렸습니다. 이 작업을 수행하는 데 문제가 있으면 새로운 질문을 해주세요.

    마찬가지로, 동일한 작업을 수행할 수 있습니다 tmux.

  5. 서비스 스크립트를 작성합니다. 당신은 데비안을 사용하고 있고 처음 사용하기 때문에 아마도 데비안에서 제공하는 기본 설정 init인 System V Init를 사용하고 있을 것입니다. 저는 System V Init용 서비스 파일을 본 적이 없으며 systemd와 약간의 Upstart만 살펴보았습니다. 따라서 여기서는 도움을 드릴 수 없습니다. 이 질문을 계속하려면 새로운 질문을 해주세요.

    IMHO 이것은 최소한의 "해킹" 방법이며 서버를 오랫동안 실행하는 경우 다음과 같은 명령을 사용하여 시스템의 다른 서비스처럼 서버를 관리할 수 있으므로 이 방법을 고려해야 합니다 sudo service your_server stop. 이 방법은 부팅 시 서버를 자동으로 시작하며 screen백그라운드에서도 자동으로 발생하므로 그럴 필요가 없습니다 .

    또한 자동으로 루트로 실행되는데 이는 위험합니다. 서버를 위해 특별히 생성된 권한 없는 사용자가 되어 자신이 가진 권한을 포기하는 논리를 서버에 넣어야 합니다. (이것은 서버가 손상되는 것을 방지하기 위한 것입니다. 누군가가 귀하의 서버를 통해 루트로 무언가를 실행할 수 있다고 상상해보세요! 윽.이 문제이것에 대해 이야기하길 잘했어요. )

답변3

사용감독정말 진지하다면요.

바이너리를 실행하는 기본 방법은 다음과 같습니다.

$ nohup node app &
$ echo $! > node-instance.pid

그러다가 죽이고 싶을 때

$ kill `cat node-instance.pid`

하지만 저는 Supervisord를 사용하겠습니다. 그것은 당신이 많은 멋진 일을 할 수 있게 해준다.

답변4

Bash 쉘을 실행 중인 경우 선택적으로 이 disown명령을 사용할 수 있습니다. 이 명령은 nohup찾은 첫 번째 실행 프로그램을 사용한다는 점을 제외하면 동일한 작업을 수행합니다. 예를 들어:

$ command &
$ disown

또는 프로세스를 분기하고 상위 프로세스를 종료하여 하위 프로세스가 init에 의해 상속되도록 하는 스크립트를 생성할 수 있습니다. 예를 들어, 이것이 제가 스크립트로 수행한 작업입니다. 간단하지는 않지만 시작하면 자동으로 백그라운드로 들어가고 로그아웃해도 종료되지 않습니다.

또 다른 해결책은 간단한 명령으로 시작, 중지, 다시 시작 또는 모든 작업을 수행할 수 있도록 서비스 파일을 생성하고 활성화하는 것입니다. (하지만 나는 archlinux를 사용하고 있기 때문에 데비안이 systemd를 사용하고 있는지는 잘 모르겠습니다)

관련 정보