퍼티를 닫을 때 Python 스크립트를 계속 실행하는 방법

퍼티를 닫을 때 Python 스크립트를 계속 실행하는 방법

VPS의 Ubuntu에서 Python 스크립트를 실행하려고 합니다. 이는 기계 학습 학습 프로세스이므로 학습하는 데 엄청난 시간이 걸립니다. 해당 프로세스를 중단하지 않고 어떻게 퍼티를 닫을 수 있습니까?

답변1

두 가지 주요 선택이 있습니다:

  1. 를 사용하여 명령을 실행합니다 nohup. 이렇게 하면 세션에서 연결이 해제되고 연결을 끊은 후에도 계속 실행됩니다.

    nohup pythonScript.py
    

    nohup.out명령의 stdout은 리디렉션( )하지 않는 한 호출된 파일에 추가됩니다 nohup pythonScript.py > outfile.

  2. 와 같은 스크린 멀티플렉서를 사용하십시오 tmux. 이렇게 하면 원격 컴퓨터와의 연결을 끊을 수 있지만 다음에 연결할 때 다시 실행하면 tmux attach정확히 동일한 세션에 있게 됩니다. 명령은 계속 실행 중이며(로그아웃해도 계속 실행됨) 로그아웃하지 않은 것처럼 stdout 및 stderr을 볼 수 있습니다.

    tmux 
    pythonScript.py
    

    실행한 후 PuTTY 창을 닫으면 됩니다. 그런 다음 다음날 다시 연결하고 tmux attach다시 실행하면 시작한 곳으로 돌아갑니다.

답변2

그만큼screen모든 Linux 배포판에서 사용할 수 있는 도구가 이를 지원합니다.

설치하려면 apt-get install screendeb 기반 Linux 배포판 또는 RPM 기반 배포판에서 dnf install -y screen실행 yum install -y screen하세요.

사용:

$ screen

새로운 쉘이 시작됩니다. 이 셸에서 Python 스크립트를 시작할 수 있습니다. 그런 다음 Ctrl++를 누른 다음 을 Shift누르 세요 . 스크립트를 실행 중인 셸에서 터미널이 분리됩니다. 게다가 스크립트는 여전히 실행 중입니다.AD

스크립트가 어떻게 실행되는지 확인하려면 를 호출하면 됩니다 screen -r. 그러면 백그라운드에서 실행 중인 Python 스크립트를 사용하여 터미널이 셸에 다시 연결됩니다.

UPD: Fox가 언급한 것처럼 screen은 systemd에서 제대로 작동하지 않습니다. 하지만 systemd를 사용하여 스크립트를 시작할 수 있습니다.공식적인 예.

예를 들어 스크립트가 에 의해 시작된 경우 /usr/bin/myPythonScript다음과 같이 Systemd 유닛 파일을 생성할 수 있습니다.

$ cat /etc/systemd/system/myPythonScript.service

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

보다, 이 스크립트를 시작할 수 있습니다 # systemctl daemon-reload # systemctl start myPythonScript

시스템 시작 시 이 스크립트가 자동으로 시작되도록 하려면 -

# systemctl enable myPythonScript

언제든지 스크립트가 어떻게 실행되는지 확인할 수 있습니다.

# systemctl status myPythonScript

스크립트 로그를 검토할 수 있는 광고

# journalctl -u myPythonScript -e

답변3

&대부분의 프로세스는 stdout, stderr, stdin(모든 설명자가 리디렉션에 항상 필요한 것은 아님)을 리디렉션하고 제어 연산자를 사용하여 속일 수 있습니다 .

그게 ping example.com 1>/dev/null &효과가 있는지 확인하세요.

물론 일부 프로그램은 더 정교하고 @terdon이 언급한 것과 같은 솔루션이 필요하지만 가장 적합한 것이 무엇인지 알고 사용하는 것이 좋습니다.

편집 : 작성된대로이 답변로그아웃 시 프로세스를 종료합니다 systemd. 기본적으로 로그아웃 시 프로세스 종료 의 일부 버전은 systemd그렇지 않습니다. 이 동작은 다음 옵션을 설정하여 /etc/systemd/logind.conf를 수정하여 변경할 수 있습니다. 작성된 대로 @terdon의 솔루션에서 발생할 수 있는 몇 가지 문제를 해결할 수도 있습니다.

에서 man logind.conf:

KillUserProcesses=

부울 인수를 사용합니다. 사용자가 로그아웃할 때 사용자의 프로세스를 종료해야 하는지 여부를 구성합니다. true인 경우 세션에 해당하는 범위 단위와 해당 범위 내의 모든 프로세스가 종료됩니다. false인 경우 범위는 "폐기"됩니다(systemd.scope(5) 참조). 프로세스는 종료되지 않습니다. 기본값은 "예"이지만 아래 옵션을 참조 KillOnlyUsers=하세요 KillExcludeUsers=.

세션 프로세스 외에도 사용자 프로세스는 사용자 관리자 단위에서 실행될 수 있습니다.[이메일 보호됨]. 느린 설정에 따라 사용자는 로그인 세션과 관계없이 프로세스를 실행할 수 있습니다. (1) enable-linger의 설명을 참조하십시오 loginctl.

(1) 및 (1)과 같은 도구를 세션 범위 밖으로 이동하지 않는 한 설정하면 KillUserProcesses=yes도구가 중단됩니다 . (1) 의 예를 참조하세요 .screentmuxsystemd-run

자세한 내용은 연결된 답변을 읽어보세요.

관련 정보