Pythonスクリプトbgservice.py
があり、ビルドするWebサービスの一部であるため、常に実行する必要があります。 SSHをログアウトした後でも継続的に実行するにはどうすればよいですか?
Nohup python bgservice.py &
を実行して、ハングアップ信号を無視して実行し続けるスクリプトを取得します。出力はNohup.out
に入れられます。
理想的には、スクリプトが supervise
のように実行されるため、(死んだ場合に)再起動できます。
すでにプロセスを開始しており、それを終了してNohupで再起動したくない場合は、バックグラウンドに送信してからそれを否認できます。
Ctrl+Z
(プロセスを中断)
bg
(バックグラウンドでプロセスを再起動します
disown %1
(これがジョブ#1であると仮定すると、jobs
を使用して決定します)
GNU screen を使用することもできます。これは、ほぼすべてのLinux/Unixシステムに必要です。
Ubuntu/Debianを使用している場合、その改良版 byob もかなりいいです。
here で説明されているように、pythonスクリプトを適切なpythonデーモンに変えることを検討できます。
python-daemon は、永久に実行されるスクリプトではなく、バックグラウンドデーモンプロセスとしてpythonスクリプトを実行するために使用できる優れたツールです。既存のコードを少し変更する必要がありますが、それは単純で単純です。
Python-daemonで問題に直面している場合、別のユーティリティ supervisor がありますが、これは同じことをしますが、この場合、これはプロセスをデーモン化するためのすぐに使えるソリューション。
Nohupできますが、私は screen を好みます。
デコレータを使用したpython内の簡単なソリューションを次に示します。
import os, time
def daemon(func):
def wrapper(*args, **kwargs):
if os.fork(): return
func(*args, **kwargs)
os._exit(os.EX_OK)
return wrapper
@daemon
def my_func(count=10):
for i in range(0,count):
print('parent pid: %d' % os.getppid())
time.sleep(1)
my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own
もちろん、bgservice.py
の代わりにmy_func
ファイルのコンテンツを置き換えることができます。
zsh シェルには、すべてのバックグラウンドプロセスをNohupで実行するオプションがあります。
~/.zshrc
に次の行を追加します。
setopt nocheckjobs #don't warn about bg processes on exit
setopt Nohup #don't kill bg processes on exit
次に、python bgservice.py &
のようなプロセスを実行するだけで、Nohupコマンドを使用する必要がなくなります。
多くの人がzshを使用しているわけではないことを知っていますが、これは本当にお勧めのシェルです。
ログインしているかどうかに関係なく、プロセスを永久に実行する必要がある場合は、プロセスをデーモンとして実行することを検討してください。
supervisord は、あらゆるプロセスをデーモン化するために使用できる、すぐに使える優れたソリューションです。スーパーバイザーによって実行されているプロセスを監視するために使用できる別の制御ユーティリティsupervisorctl
があります。
これを機能させるために、余分なコードを記述したり、既存のスクリプトを変更したりする必要はありません。さらに、詳細なドキュメントにより、このプロセスがはるかに簡単になります。
Python-daemonの周りで何時間も頭を悩ませた後、supervisorは数分で私のために働いたソリューションです。
これが誰かがpython-daemonを動作させようとしていることを願っています
Yapdiを使用することもできます:
基本的な使用法:
import yapdi daemon = yapdi.Daemon() retcode = daemon.daemonize() # This would run in daemon mode; output is not visible if retcode == yapdi.OPERATION_SUCCESSFUL: print('Hello Daemon')