SSHからログアウトした後でも、Pythonスクリプトをバックグラウンドで実行するにはどうすればよいですか?


110

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

回答:


213

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

理想的には、次のようなスクリプトを実行superviseして、(いつ)死んだ場合でも再起動できるようにします。


15
nohupと&を使用してコマンドを実行すると、メッセージnohup: ignoring in put and appending output to nohup.out'` が表示され、Enterキーを押すと、ステータス1でプロセスが終了します。
Santosh Ghimire

1
nohup.outの出力を読み取ります。私の場合、それは権限の問題でした、私はsudoを使用する必要がありました
mxns

この方法で実行した後、bgserviceを停止する方法は?
ホールで発砲

1
@Shaegorathはpidをどこかに保存して、後でプロセスにシグナルを送信できるようにします。一部のシェル(bash、zshなど)では、実行後somecommand &にpidを次のように出力し[1] 12345ます。それ以外の場合は使用できます$!
トニーベータラムダ

31

プロセスをすでに開始していて、それを強制終了してnohupの下で再起動したくない場合は、プロセスをバックグラウンドに送信して、否認することができます。

Ctrl+Z (プロセスを一時停止)

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

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



12

ここで説明するように、Pythonスクリプトを適切なPythonデーモンに変換することを検討してください。

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

python-daemonで問題が発生している場合は、同じことを行う別のユーティリティスーパーバイザがいますが、この場合は、デーモン化のためのすぐに使えるソリューションであるため、コードを記述する(または既存のコードを変更する)必要はありません。プロセス。


問題を解決する方法について簡単に説明することは、一般的に良い考えです。
Nikhil Sahu


5

以下は、デコレータを使用した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


1
たぶん、SIGHUPシグナルをキャッチする必要があります。次に、ブロックにsignal.signal(signal.SIGHUP、handler)を追加します。
Chouettou 2017年

3

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


1

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

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

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

python-daemonの周りで何時間も頭を悩ませた後、スーパーバイザーは私にとって数分で機能するソリューションです。

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


1

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

1

これを試して:

nohup python -u <your file name>.py >> <your log file>.log &

画面で上記のコマンドを実行し、画面から出ることができます。

これで、Pythonスクリプトのログをテールすることができます。 tail -f <your log file>.log

スクリプトを強制終了するには、ps -auxおよびkillコマンドを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.