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


19

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


1
チェックアウトしnohupます。
phk

回答:


36

主に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すると、元の場所に戻ります。


4
1&2の代替:1. disown2.screen
heemayl

言及する価値があるかもしれませんbyobutmuxまたはscreenのラッパー。
ブリ

2

screenすべてのLinuxディストリビューションのために利用できるツールは、これをサポートしています。

それをインストールするには、実行apt-get install screenDEBベースのLinuxディストリビューションのために、または dnf install -y screenまたはyum install -y screenRPMベースのもののために。

使用するには:

$ 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


デフォルトの構成screensystemdはうまく動作しないことに注意してください。Ubuntuの使用している場合、私は知りませんsystemdが、行動や回避策は、あなたの答えに言及する価値があるかもしれない
フォックス

1

ほとんどのプロセスは、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=以下のオプションを参照してください。

セッションプロセスに加えて、ユーザープロセスはユーザーマネージャーユニットuser @ .serviceで実行できます。リンガーの設定によっては、これにより、ユーザーはログインセッションに関係なくプロセスを実行できる場合があります。説明を参照してくださいenable-lingerloginctl(1)。

セッションスコープから移動しない限り、設定により(1)や(1)などのKillUserProcesses=yesツールが破損することに注意してください。(1)の例を参照してください。screentmuxsystemd-run

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


1
これは単にプロセスをバックグラウンドに送信します。OPは、リモートsshセッションから切断してプロセスを続行できるようにしたいと考えています。これはそのような状況では役に立ちません。リモートセッションを終了すると、コマンドがバックグラウンドにある場合でもコマンドが停止します。
テルドン

@terdon私の例が機能するかどうか確認しましたか?私はチェックしましたが、私の答えに書いたように、いくつかのコマンドで動作します。
発泡スチロールフライ

はい、確認しました。はい、コマンドが継続することもあります。ただし、コマンドが停止することはよく見られるので、どのコマンドが続行するかを正確に説明したり、続行するかどうかを事前に知る方法を提供したりしない限り、これはあまり役に立ちません。実際、あなたが与えた特定の例は、私のArchからリモートUbuntuシステムに接続して実行したテストで失敗しました。
テルドン

@terdon funny、リモートPLDに接続しているローカルArchLinuxでこれを確認しました。常に機能する唯一のルールは、「プログラムは使用し、使用isatty()しない場合は終了しますか?」です。
発泡スチロールフライ

それは独自の質問に値するかもしれません。以前は常にnohupが必要でしたが、ある時点で何かが変わりましたが、時々必要ではありませんでした。ただし、親シェルを終了すると、子も殺されるはずです。しかし、はい、時々そうではありません。私はそれが何らかの形で構成可能でなければならないと推測しています。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.