回答:
実行nohup python bgservice.py &
して、ハングアップ信号を無視して実行を継続するスクリプトを取得します。出力はに入れられnohup.out
ます。
理想的には、次のようなスクリプトを実行supervise
して、(いつ)死んだ場合でも再起動できるようにします。
somecommand &
にpidを次のように出力し[1] 12345
ます。それ以外の場合は使用できます$!
。
ここで説明するように、Pythonスクリプトを適切なPythonデーモンに変換することを検討してください。
python-daemonは、Pythonスクリプトを永続的に実行するスクリプトではなく、バックグラウンドデーモンプロセスとして実行するために使用できる優れたツールです。既存のコードを少し変更する必要がありますが、単純で単純です。
python-daemonで問題が発生している場合は、同じことを行う別のユーティリティスーパーバイザがいますが、この場合は、デーモン化のためのすぐに使えるソリューションであるため、コードを記述する(または既存のコードを変更する)必要はありません。プロセス。
以下は、デコレータを使用した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の周りで何時間も頭を悩ませた後、スーパーバイザーは私にとって数分で機能するソリューションです。
これが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')
nohup: ignoring in put and appending output to
nohup.out'` が表示され、Enterキーを押すと、ステータス1でプロセスが終了します。