如何在關閉 putty 時保持 python 腳本運行

如何在關閉 putty 時保持 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 screen針對基於 deb 的 Linux 發行版運行,或 dnf install -y screen針對yum install -y screen基於 RPM 的發行版運行。

使用方法:

$ screen

啟動一個新的外殼。在此 shell 中,您可以啟動 Python 腳本。然後您可以按Ctrl+ Shift+A然後D。它將把您的終端與運行腳本的 shell 分開。而且,腳本仍在其中運行。

若要查看腳本的運行情況,您可以呼叫screen -r.這會將您的終端重新連接到 shell,並使用您在背景執行的 Python 腳本。

UPD:正如 Fox 所提到的,螢幕與 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),且程序不會終止。預設為“yes”,但請參閱KillOnlyUsers=下面的選項KillExcludeUsers=

除了會話進程之外,使用者進程還可以在使用者管理器單元下執行[電子郵件受保護]。根據延遲設置,這可能允許用戶獨立於其登入會話運行進程。參見(1)enable-linger中的描述。loginctl

請注意,設定將破壞(1) 和(1)KillUserProcesses=yes等工具,除非將它們移出會話範圍。請參閱(1)中的範例。screentmuxsystemd-run

閱讀連結的答案以了解更多資訊。

相關內容