web-dev-qa-db-ja.com

SSHをログアウトした後でも、バックグラウンドでPythonスクリプトを実行する方法は?

Pythonスクリプトbgservice.pyがあり、ビルドするWebサービスの一部であるため、常に実行する必要があります。 SSHをログアウトした後でも継続的に実行するにはどうすればよいですか?

101
zihaoyu

Nohup python bgservice.py &を実行して、ハングアップ信号を無視して実行し続けるスクリプトを取得します。出力はNohup.outに入れられます。

理想的には、スクリプトが supervise のように実行されるため、(死んだ場合に)再起動できます。

191
Edward Dale

すでにプロセスを開始しており、それを終了してNohupで再起動したくない場合は、バックグラウンドに送信してからそれを否認できます。

Ctrl+Z(プロセスを中断)

bg(バックグラウンドでプロセスを再起動します

disown %1(これがジョブ#1であると仮定すると、jobsを使用して決定します)

27
Cooper

GNU screen を使用することもできます。これは、ほぼすべてのLinux/Unixシステムに必要です。

Ubuntu/Debianを使用している場合、その改良版 byob もかなりいいです。

16

here で説明されているように、pythonスクリプトを適切なpythonデーモンに変えることを検討できます。

python-daemon は、永久に実行されるスクリプトではなく、バックグラウンドデーモンプロセスとしてpythonスクリプトを実行するために使用できる優れたツールです。既存のコードを少し変更する必要がありますが、それは単純で単純です。

Python-daemonで問題に直面している場合、別のユーティリティ supervisor がありますが、これは同じことをしますが、この場合、これはプロセスをデーモン化するためのすぐに使えるソリューション。

10
Dustin Kirkland

Nohupできますが、私は screen を好みます。

6
Randy Proctor

デコレータを使用した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ファイルのコンテンツを置き換えることができます。

5
Chouettou

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を使用しているわけではないことを知っていますが、これは本当にお勧めのシェルです。

3
jonescb

ログインしているかどうかに関係なく、プロセスを永久に実行する必要がある場合は、プロセスをデーモンとして実行することを検討してください。

supervisord は、あらゆるプロセスをデーモン化するために使用できる、すぐに使える優れたソリューションです。スーパーバイザーによって実行されているプロセスを監視するために使用できる別の制御ユーティリティsupervisorctlがあります。

これを機能させるために、余分なコードを記述したり、既存のスクリプトを変更したりする必要はありません。さらに、詳細なドキュメントにより、このプロセスがはるかに簡単になります。

Python-daemonの周りで何時間も頭を悩ませた後、supervisorは数分で私のために働いたソリューションです。

これが誰かがpython-daemonを動作させようとしていることを願っています

1
Nikhil Sahu

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')