Putty を閉じても Python スクリプトを実行し続ける方法

Putty を閉じても Python スクリプトを実行し続ける方法

VPS 上の Ubuntu で Python スクリプトを実行しようとしています。これは機械学習のトレーニング プロセスなので、トレーニングに非常に時間がかかります。そのプロセスを停止せずに Putty を閉じるにはどうすればよいですか。

答え1

主に 2 つの選択肢があります。

  1. でコマンドを実行しますnohup。これにより、セッションとの関連付けが解除され、切断後も実行が継続されます。

    nohup pythonScript.py
    

    コマンドの stdout は、nohup.outリダイレクトしない限り、 というファイルに追加されることに注意してください ( nohup pythonScript.py > outfile)。

  2. のようなスクリーン マルチプレクサを使用しますtmux。これにより、リモート マシンから切断できますが、次に接続してtmux attach再度実行すると、まったく同じセッションになります。コマンドは引き続き実行され (ログアウトしても実行が継続されます)、ログアウトしていないかのように stdout と stderr を表示できます。

    tmux 
    pythonScript.py
    

    起動したら、PuTTY ウィンドウを閉じます。翌日に再度接続し、tmux attach再度実行すると、開始した状態に戻ります。

答え2

screenすべての Linux ディストリビューションで利用可能なツールがこれをサポートしています。

インストールするには、apt-get install screendeb ベースの 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-lingerlinger設定によっては、ログインセッションとは独立してプロセスを実行できる場合があります。(1)の説明を参照してくださいloginctl

設定により、(1)や(1)KillUserProcesses=yesのようなツールはセッションスコープ外に移動されない限り機能しなくなることに注意してください。(1)の例を参照してください。screentmuxsystemd-run

詳細については、リンクされた回答をお読みください。

関連情報