定期的にpng画像を生成し、ブラウザを介してアクセスできるサーバーに配置するPythonスクリプトがあります。このイメージは、サーバーで実行されているジョブの進行状況を示しています。 matplotlibを使用して画像を生成しています。
Pythonスクリプトは各画像を作成した後、スリープモードに入ります。 1時間後に目が覚めて新しい画像を作成し、再びスリープモードに戻ります。
SSHセッションを介してスクリプトを開始します。ログアウトするとスクリプトが終了します。この問題を扱う別のスレッドを読みましたが、提案された回避策は機能しません。次のコマンドでスクリプトを実行しても、ログアウト後にスクリプトが終了します。
nohup script.py &> job-monitor.log &
またはこうして走るなら
script.py
[Ctrl-Z]
disown -h %1
bg 1
奇妙なことに、ログアウトして再度ログインすると、スクリプトは実行されなくなり、job-monitor.logが空になることです。
何が起こる可能性があり、ログアウト後もスクリプトを実行し続けるにはどうすればよいですか?
追加情報:問題は、私が使用しているフローティングライブラリmatplotlibに関連しているようです。グラフィックがディスクに保存されているにもかかわらず、pngを作成するにはXセッションが必要になる可能性があると思います。
答え1
問題がmatplotlibにある場合(つまり、接続を維持している場合はスクリプトが応答を提供しないか、sshがXwindow接続を渡すために機能する場合)、matplotlibrcファイルに入れる必要があります。
backend : AGG
これにより、スクリプトが機能するためにXwindowが不要になります。
答え2
セッションを監視するためにまたはをIO/redirecting
使用する代わりに。tmux
screen command
答え3
time.sleep()
スクリプトの適切な部分を破棄し、定期的および/または遅延呼び出しに使用することを控えめに提案してもよいでしょうcron
かat
。
これにより、コードが簡素化され、SSHセッションの分離に対する依存関係が安全に排除され、イメージの作成と予約の問題が分離されます。
nohup
スクリプトの終了関連:後続のスクリプトには、スクリプトが開始されたディレクトリへの書き込みアクセス権がないか、既存のログファイルがルート所有であるためアクセスできないため、ログファイルへの書き込みアクセス権がないと考えられます。
仕事をやめるべきかどうかわかりません。それからbg
それに反対する主張を試みることは効果があります。私はいつもその逆に振る舞います。foo & disown %1
あなたと同じ状況では完全に動作します。
答え4
また、STDINをリダイレクトしてみてください。スクリプトが標準入力から読み取られている可能性があるため、シェルを閉じると標準入力が消えて消えます。
script.py </dev/null &>/dev/null &
disown