
我即將在 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 發行版運行,或
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)中的範例。screen
tmux
systemd-run
閱讀連結的答案以了解更多資訊。