以下の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))
私は「dtach」を使用するというErichHeineの提案を使用していますが、これは私にとってはかなりうまく機能しています。
def runbg(cmd, sockname="dtach"):
return run('dtach -n `mktemp -u /tmp/%s.XXXX` %s' % (sockname, cmd))
これが見つかりました ここ 。
私が実験したように、解決策は2つの要因の組み合わせです。
したがって、関数は次のようになります。
def background_run(command):
command = 'Nohup %s &> /dev/null &' % command
run(command, pty=False)
そして、あなたはそれを起動することができます:
execute(background_run, your_command)
あなたはただ走る必要があります
run("(Nohup yourcommand >& /dev/null < /dev/null &) && sleep 1")
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を実行するのに役立ったように、これがお役に立てば幸いです。
これは私のために働いた:
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)
Nohup
が機能せず、これを使用したいすべてのボックスにtmux
またはdtach
がインストールされていなかったため、screen
を次のように使用することになりました。
_run("screen -d -m bash -c '{}'".format(command), pty=False)
_
これは、コマンドを実行するデタッチされたターミナルでbashシェルを開始するように画面に指示します
あなたは遭遇している可能性があります この問題
'pty = False'をSudoコマンドに追加してみてください(virtualenvがSudoを呼び出しているか、どこかで実行されていると思いますか?)
あなたが使用することができます:
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)
別のローカルシェルスクリプトで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 -m
もpty=False
/sleep 1
も適切に機能しませんでした。YMMV、特に私はわからないなぜこれはうまくいく...)