
VPS 上の Ubuntu で Python スクリプトを実行しようとしています。これは機械学習のトレーニング プロセスなので、トレーニングに非常に時間がかかります。そのプロセスを停止せずに Putty を閉じるにはどうすればよいですか。
答え1
主に 2 つの選択肢があります。
でコマンドを実行します
nohup
。これにより、セッションとの関連付けが解除され、切断後も実行が継続されます。nohup pythonScript.py
コマンドの stdout は、
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) を参照)、プロセスは強制終了されません。デフォルトは「yes」ですが、以下のオプションを参照して
KillOnlyUsers=
くださいKillExcludeUsers=
。セッションプロセスに加えて、ユーザープロセスはユーザーマネージャーユニットの下で実行される場合があります。[メールアドレス]
enable-linger
linger設定によっては、ログインセッションとは独立してプロセスを実行できる場合があります。(1)の説明を参照してくださいloginctl
。設定により、(1)や(1)
KillUserProcesses=yes
のようなツールはセッションスコープ外に移動されない限り機能しなくなることに注意してください。(1)の例を参照してください。screen
tmux
systemd-run
詳細については、リンクされた回答をお読みください。