VPS의 Ubuntu에서 Python 스크립트를 실행하려고 합니다. 이는 머신러닝 학습 과정이므로 학습하는데 많은 시간이 소요됩니다. 프로세스를 중단하지 않고 어떻게 퍼티를 닫을 수 있나요?
답변1
두 가지 주요 옵션이 있습니다.
실행 명령을 사용하십시오
nohup
. 이렇게 하면 세션에서 연결이 해제되고 연결을 끊은 후에도 계속 실행됩니다.nohup pythonScript.py
nohup.out
명령의 표준 출력은 리디렉션( )하지 않는 한 이름이 지정된 파일에 추가됩니다nohup pythonScript.py > outfile
.예를 들어 스크린 멀티플렉서를 사용하면
tmux
원격 컴퓨터와의 연결이 끊어지지만 다음에 연결할 때tmux attach
다시 실행하면 정확히 동일한 세션에 있게 됩니다. 명령은 계속 실행되며(로그아웃해도 계속 실행됨) 로그아웃하지 않은 것처럼 해당 stdout 및 stderr을 볼 수 있습니다.tmux pythonScript.py
일단 시작되면 PuTTY 창을 닫으면 됩니다. 그런 다음 다음날 다시 연결하고
tmux attach
다시 실행하면 시작한 곳으로 바로 돌아옵니다.
답변2
이것screen
모든 Linux 배포판에 사용 가능한 도구는 이 기능을 지원합니다.
설치하려면 apt-get install screen
deb 기반 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)의 예를 참조하세요.screen
tmux
systemd-run
자세한 내용은 연결된 답변을 읽어보세요.