回答:
主に2つの選択肢があります。
でコマンドを実行しnohup
ます。これにより、セッションとの関連付けが解除され、切断後も実行を継続できます。
nohup pythonScript.py
コマンドのstdoutは、nohup.out
リダイレクト(nohup pythonScript.py > outfile
)しない限り、呼び出されたファイルに追加されることに注意してください。
のようなスクリーンマルチプレクサを使用しますtmux
。これにより、リモートマシンから切断できますが、次に接続したときに、tmux attach
再度実行すると、まったく同じセッションにいることに気付くでしょう。コマンドは引き続き実行され(ログアウトしても実行を継続します)、ログアウトしていないかのようにstdoutとstderrを見ることができます。
tmux
pythonScript.py
起動したら、PuTTYウィンドウを閉じます。その後、翌日に再び接続し、再度実行tmux attach
すると、元の場所に戻ります。
disown
2.screen
byobu
tmuxまたはscreenのラッパー。
screen
すべてのLinuxディストリビューションのために利用できるツールは、これをサポートしています。
それをインストールするには、実行apt-get install screen
DEBベースのLinuxディストリビューションのために、または
dnf install -y screen
またはyum install -y screen
RPMベースのもののために。
使用するには:
$ 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)を参照)。プロセスは強制終了されません。デフォルトは「yes」ですが
KillOnlyUsers=
、KillExcludeUsers=
以下のオプションを参照してください。セッションプロセスに加えて、ユーザープロセスはユーザーマネージャーユニットuser @ .serviceで実行できます。リンガーの設定によっては、これにより、ユーザーはログインセッションに関係なくプロセスを実行できる場合があります。説明を参照してください
enable-linger
中loginctl
(1)。セッションスコープから移動しない限り、設定により(1)や(1)などの
KillUserProcesses=yes
ツールが破損することに注意してください。(1)の例を参照してください。screen
tmux
systemd-run
詳細については、リンクされた回答をご覧ください。
isatty()
しない場合は終了しますか?」です。
nohup
ます。