web-dev-qa-db-ja.com

pythonスクリプトをパテを閉じるときに実行し続ける方法

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

19
chickensoup

主に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を実行すると、開始した場所に戻ります。

38
terdon

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

2
vodolaz095

ほとんどのプロセスは、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)の例を参照してください。

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

1
styrofoam fly