VPS上のUbuntuでpythonスクリプトを実行しようとしています。これは機械学習のトレーニングプロセスなので、トレーニングには非常に時間がかかります。そのプロセスを停止せずにPuTTYを閉じるにはどうすればよいですか。
主に2つの選択肢があります。
Nohup
を使用してコマンドを実行します。これにより、セッションとの関連付けが解除され、切断後も実行を継続できます。
Nohup pythonScript.py
コマンドのstdoutは、リダイレクトしない限り、Nohup.out
というファイルに追加されることに注意してください(Nohup pythonScript.py > outfile
)。
tmux
のような画面マルチプレクサを使用します。これにより、リモートマシンから切断できますが、次に接続したときにtmux attach
を再度実行すると、まったく同じセッションにいることがわかります。コマンドは引き続き実行され(ログアウトしても実行され続けます)、ログアウトしたことがないかのように、そのstdoutとstderrを確認できます。
tmux
pythonScript.py
それを起動したら、PuTTYウィンドウを閉じます。その後、翌日に再度接続し、再度tmux attach
を実行すると、開始した場所に戻ります。
screen
ツールは、すべてのLinuxディストリビューションで使用でき、これをサポートしています。
これをインストールするには、debベースのLinuxディストリビューションの場合はapt-get install screen
、RPMベースのLinuxディストリビューションの場合はdnf install -y screen
またはyum install -y screen
を実行します。
使用するには:
$ 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
ほとんどのプロセスは、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=
を参照してください。セッションプロセスに加えて、ユーザープロセスはユーザーマネージャーユニットuser @ .serviceで実行できます。リンガー設定によっては、これによりユーザーがログインセッションとは関係なくプロセスを実行できる場合があります。
loginctl
(1)のenable-linger
の説明を参照してください。
KillUserProcesses=yes
を設定すると、screen
(1)やtmux
(1)などのツールがセッションスコープ外に移動されない限り、機能しなくなります。systemd-run
(1)の例を参照してください。
詳細については、リンクされた回答をお読みください。