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


19

VPS의 Ubuntu에서 Python 스크립트를 실행하려고합니다. 기계 학습 훈련 과정이므로 훈련하는 데 많은 시간이 걸립니다. 그 과정을 멈추지 않고 퍼티를 어떻게 닫을 수 있습니까?


1
확인하십시오 nohup.
phk

답변:


36

두 가지 주요 선택 사항이 있습니다.

  1. 로 명령을 실행하십시오 nohup. 세션에서 연결이 끊어지고 연결을 끊은 후에도 계속 실행됩니다.

    nohup pythonScript.py

    명령의 stdout은 nohup.out사용자가 경로 재지 정하지 않는 한 호출 된 파일에 추가됩니다 ( nohup pythonScript.py > outfile).

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

    tmux 
    pythonScript.py
    

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


4
1 & 2에 대한 대안 : 1. disown2.screen
heemayl

byobutmux 또는 화면을 감싸는 래퍼를 언급 할 가치가 있습니다.
bli

2

screen모든 리눅스 배포판에 사용할 도구는이를 지원합니다.

이를 설치하려면 apt-get install screendeb 기반 Linux 배포판 dnf install -y screen또는 yum install -y screenRPM 기반 배포판을 실행하십시오 .

쓰다:

$ screen

새로운 쉘이 시작됩니다. 이 셸에서 Python 스크립트를 시작할 수 있습니다. 그런 다음 Ctrl+ Shift+ A를 누른 다음을 누를 수 있습니다 D. 스크립트를 실행하는 쉘에서 터미널을 분리합니다. 또한 스크립트는 여전히 실행 중입니다.

스크립트가 어떻게 실행되는지 확인하려면을 호출하십시오 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


screen와 정확하게 잘 재생되지 않는 systemd기본 구성에. 내가 만약 우분투의 용도를 모른다 systemd, 그러나 행동과 해결 방법은 답변에서 언급 할만큼 가치있을 수 있습니다
폭스

1

대부분의 프로세스는 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)를 참조하고 프로세스가 종료되지 않습니다. 기본값은 "yes"이지만 옵션 KillOnlyUsers=KillExcludeUsers=아래를 참조하십시오 .

세션 프로세스 외에도 사용자 프로세스는 사용자 관리자 유닛 user @ .service 하에서 실행될 수 있습니다. 느린 설정에 따라 사용자가 로그인 세션과 독립적으로 프로세스를 실행할 수 있습니다. 의 설명을 참조하십시오 enable-linger에서 loginctl(1).

세션 범위를 벗어나지 않으면 (1) 및 (1) 과 KillUserProcesses=yes같은 도구 를 설정 하면 설정 이 중단 됩니다. (1)의 예를 참조하십시오 .screentmuxsystemd-run

자세한 내용은 링크 된 답변을 읽으십시오.


1
이것은 단순히 프로세스를 백그라운드로 보냅니다. OP는 원격 ssh 세션에서 연결을 끊고 프로세스를 계속 진행하려고합니다. 이 상황에서는 도움이되지 않으므로 원격 세션을 종료하면 명령이 백그라운드에 있더라도 명령을 중지합니다.
terdon

@terdon 내 예제가 작동하는지 확인 했습니까? 나는 답변을 작성 했으므로 확인했으며 일부 명령에서 작동합니다 .
스티로폼은

예, 확인했습니다. 예, 때때로 명령이 계속되는 것을 보았습니다. 그러나 나는 명령이 멈추는 것을 자주 보았으므로 명령이 계속 진행되는 것을 정확하게 설명하거나 명령이 계속되는지 여부를 미리 알 수 없다면 이것이 유용하지 않습니다. 사실, 당신이 제공 한 특정 예제는 방금 아치에서 원격 우분투 시스템으로 연결 한 테스트에서 실패했습니다.
terdon

@ terdon funny, 나는 원격 PLD에 연결하는 로컬 ArchLinux에서 이것을 확인했다. 항상 작동하는 유일한 규칙은 "프로그램을 사용 isatty()하고 있지 않은 경우 종료합니까?"입니다.
스티로폼

그것은 그 자신의 질문에 가치가 있습니다. 나는 항상 nohup이 필요하다는 것을 알고 있었고, 어떤 시점에서 무언가가 바뀌었고 때로는 그렇지 않았습니다. 그래도 isatty가 어떻게 될 수 있는지 알 수 없습니다. 부모 쉘을 종료하면 자식도 죽여야합니다. 그러나 예, 때로는 그렇지 않습니다. 어떻게 든 구성 할 수 있어야한다고 생각합니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.