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

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

VPS의 Ubuntu에서 Python 스크립트를 실행하려고 합니다. 이는 머신러닝 학습 과정이므로 학습하는데 많은 시간이 소요됩니다. 프로세스를 중단하지 않고 어떻게 퍼티를 닫을 수 있나요?

답변1

두 가지 주요 옵션이 있습니다.

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

    nohup pythonScript.py
    

    nohup.out명령의 표준 출력은 리디렉션( )하지 않는 한 이름이 지정된 파일에 추가됩니다 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

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

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

관련 정보