web-dev-qa-db-ja.com

ファブリックを使用してNohupでバックグラウンドプロセスを開始します

以下のNohupコマンドを使用して、ファブリックを使用してcelerycamプロセスを開始しようとしています。残念ながら、何も起きていません。同じコマンドを手動で使用してプロセスを開始できましたが、ファブリックを介して開始することはできませんでした。これを解決する方法についてアドバイスはありますか?

def start_celerycam():
    '''Start celerycam daemon'''
    with cd(env.project_dir):
        virtualenv('Nohup bash -c "python manage.py celerycam --logfile=%scelerycam.log --pidfile=%scelerycam.pid &> %scelerycam.Nohup &> %scelerycam.err" &' % (env.celery_log_dir,env.celery_log_dir,env.celery_log_dir,env.celery_log_dir))
27
Mo J. Mughrabi

私は「dtach」を使用するというErichHeineの提案を使用していますが、これは私にとってはかなりうまく機能しています。

def runbg(cmd, sockname="dtach"):
    return run('dtach -n `mktemp -u /tmp/%s.XXXX` %s' % (sockname, cmd))

これが見つかりました ここ

30
danodonovan

私が実験したように、解決策は2つの要因の組み合わせです。

  • プロセスをデーモンとして実行:Nohup ./command&>/dev/null&
  • ファブリックの実行にはpty = Falseを使用します

したがって、関数は次のようになります。

def background_run(command):
    command = 'Nohup %s &> /dev/null &' % command
    run(command, pty=False)

そして、あなたはそれを起動することができます:

execute(background_run, your_command)
18
Marius Cotofana

これは この問題 のインスタンスです。コマンドが終了すると、バックグラウンドプロセスは強制終了されます。残念ながら、CentOS6ではpty-lessSudoコマンドをサポートしていません。

この号の最後のエントリでは、Sudo('set -m; service servicename start')の使用について説明しています。これによりジョブ制御がオンになるため、バックグラウンドプロセスは独自のプロセスグループに配置されます。その結果、コマンドの終了時にそれらは終了しません。

詳細については、 this linkを参照してください。

8
Tim Ludwinski

あなたはただ走る必要があります

run("(Nohup yourcommand >& /dev/null < /dev/null &) && sleep 1")
5
idaren

DTACHは行く方法です。これは、ライトバージョンのscreenのようにインストールする必要のあるソフトウェアです。これは、上記の「dtach」メソッドのより良いバージョンであり、必要に応じてdtachをインストールします。それは見つかります ここ ここでは、バックグラウンドで実行されているプロセスの出力を取得する方法も学ぶことができます:

from fabric.api import run
from fabric.api import Sudo
from fabric.contrib.files import exists


def run_bg(cmd, before=None, sockname="dtach", use_Sudo=False):
    """Run a command in the background using dtach

    :param cmd: The command to run
    :param output_file: The file to send all of the output to.
    :param before: The command to run before the dtach. E.g. exporting
                   environment variable
    :param sockname: The socket name to use for the temp file
    :param use_Sudo: Whether or not to use Sudo
    """
    if not exists("/usr/bin/dtach"):
        Sudo("apt-get install dtach")
    if before:
        cmd = "{}; dtach -n `mktemp -u /tmp/{}.XXXX` {}".format(
            before, sockname, cmd)
    else:
        cmd = "dtach -n `mktemp -u /tmp/{}.XXXX` {}".format(sockname, cmd)
    if use_Sudo:
        return Sudo(cmd)
    else:
        return run(cmd)

リモートのラズベリーパイでファブリックを介してomxplayerを実行するのに役立ったように、これがお役に立てば幸いです。

3
leosok

これは私のために働いた:

Sudo('python %s/manage.py celerycam --detach --pidfile=celerycam.pid' % siteDir)

編集:最初にpidファイルが削除されたことを確認する必要があったので、これは完全なコードでした:

# Create new celerycam
Sudo('rm celerycam.pid', warn_only=True)
Sudo('python %s/manage.py celerycam --detach --pidfile=celerycam.pid' % siteDir)
1
Chad Vernon

Nohupが機能せず、これを使用したいすべてのボックスにtmuxまたはdtachがインストールされていなかったため、screenを次のように使用することになりました。

_run("screen -d -m bash -c '{}'".format(command), pty=False)
_

これは、コマンドを実行するデタッチされたターミナルでbashシェルを開始するように画面に指示します

1
theannouncer

あなたは遭遇している可能性があります この問題

'pty = False'をSudoコマンドに追加してみてください(virtualenvがSudoを呼び出しているか、どこかで実行されていると思いますか?)

1
rupello

あなたが使用することができます:

run('Nohup /home/ubuntu/spider/bin/python3 /home/ubuntu/spider/Desktop/baidu_index/baidu_index.py > /home/ubuntu/spider/Desktop/baidu_index/baidu_index.py.log 2>&1 &', pty=False)
1
xpepsi

別のローカルシェルスクリプトでsshに対してNohup ... &を実行することで、この問題を回避することができました。 fabfile.py

@task
def startup():
    local('./do-stuff-in-background.sh {0}'.format(env.Host))

およびdo-stuff-in-background.sh

#!/bin/sh

set -e
set -o nounset

Host=$1

ssh $Host -T << HERE
   Nohup df -h 1>>~/df.log 2>>~/df.err &
HERE

もちろん、コマンドと標準出力/エラーログファイルを引数として渡して、このスクリプトをより一般的に役立つようにすることもできます。

(私の場合、dtachをインストールするための管理者権限がなく、screen -d -mpty=False/sleep 1も適切に機能しませんでした。YMMV、特に私はわからないなぜこれはうまくいく...)

0
candu