2012-01-08 21 views
25

Próbuję rozpocząć proces celerycam przy użyciu tkaniny za pomocą poniższego polecenia nohup. Niestety nic się nie dzieje, ręcznie za pomocą tego samego polecenia mogę rozpocząć proces, ale nie przez materiał. Jakieś rady, jak mogę to rozwiązać?Rozpocznij proces w tle z nohup przy użyciu tkaniny

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

Odpowiedz

27

Używam Erich Heinego sugestia, aby użyć „dtach” i to działa całkiem dobrze dla mnie:

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

stwierdzono to here.

+3

Próbowałem wielu różnych sposobów robienia tego. To był ten, który w końcu zadziałał. –

+0

Próbowałem tego, działa! Ale kiedy dodam nohup w cmd, nadal nie działa, więc właśnie usunąłem nohup i "&". – Vimos

+0

wielkie dzięki, rozwiązał wszystkie moje problemy – Cmag

1

mógł być uruchomiony w this issue

spróbuj dodać 'pty = False' do polecenia sudo (zakładam virtualenv dzwoni sudo lub uruchomić gdzieś?)

+0

taak st chory wisi nawet z pty = False –

+0

nie ma nadziei na drodze tkaniny na tym chyba. –

1

Ten pracował dla mnie:

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

Edycja: musiałem upewnić plik PID została usunięta najpierw więc był pełny kod:

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

Jest instancją this issue. Proces w tle zostanie zabity po zakończeniu polecenia. Niestety na CentOS 6 nie obsługuje poleceń sudo less.

Ostatnie zgłoszenie w wydaniu wspomina o użyciu numeru sudo('set -m; service servicename start'). Włącza to Kontrolę pracy, a zatem procesy w tle są umieszczane w ich własnej grupie procesów. W rezultacie nie są one kończone po zakończeniu polecenia.

Aby uzyskać więcej informacji, patrz link this.

+0

+1: Dzięki! Sugestia 'pty = false' nie działała dla mnie na RHEL (ponieważ sudo wymagało TTY), ale przedrostek' set -m; 'działał świetnie! Czy możemy uzyskać więcej informacji na temat tego, jakie są konsekwencje 'set -m;'? Co dokładnie to robi/jak działa to rozwiązanie? Czy jest coś, na czym powinienem się uważać? Czy jest jakieś sprzątanie, które powinienem wykonać później? – ArtOfWarfare

+0

@ArtOfWarfare, patrz [ten link] (http://ss64.com/bash/set.html) lub "zestaw man 1". –

+0

Dla mnie, oba 'run (" nohup% s> &/dev/null haridsv

3

DTACH jest drogą do zrobienia. Jest to oprogramowanie, które trzeba zainstalować jak lite wersję ekranu. To jest lepsza wersja "dtach" - metoda znaleziona powyżej, w razie potrzeby zainstaluje dtach. To można znaleźć here gdzie można również dowiedzieć się, jak wyjście z procesu, który jest uruchomiony w tle:

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) 

To może pomóc, jak bardzo mi pomógł uruchomić omxplayer poprzez tkaniny na zdalnym rasberry Liczba Pi!

+0

Czy rzeczywiście każdy dostał go do pompowania wyników do pliku output_file? Twój kod rzeczywiście nie używa tego parametru. Próbuję zrozumieć, jak mogę rejestrować zdarzenia? – jimmyb

13

Jak eksperymentowali, rozwiązaniem jest kombinacja dwóch czynników:

  • proces prowadzony w demon: nohup./ Command &>/dev/null &
  • użycie pty = False dla biegu tkaniny

Więc twoja funkcja powinna wyglądać następująco:

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

I można go uruchomić z:

execute(background_run, your_command) 
+0

pracował dla mnie (ubuntu 14.04) –

+1

'mesg: Ttyname nie powiodło się: Nieodpowiedni ioctl dla devic' – andi

0

Udało mi się obejść ten problem, uruchamiając nohup ... & przez ssh w osobnym lokalnym skrypcie powłoki. W fabfile.py:

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

aw 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 

Oczywiście, można także przekazać w poleceniu i standardowych plików dziennika/wyjście błędów jako argumenty, aby ten skrypt bardziej ogólnie użyteczne.

(W moim przypadku nie ma uprawnień administratora do zainstalowania dtach i ani screen -d -m ani pty=False/sleep 1 pracowała prawidłowo dla mnie. YMMV, zwłaszcza, że ​​nie ma pojęcia, dlaczegoto działa ...)

2

wystarczy uruchomić

run("(nohup yourcommand >& /dev/null < /dev/null &) && sleep 1") 
+0

Wow, jak to znalazłeś? Nieco prostszą wersją będzie również '(nohup yourcommand &>/dev/null

1

można użyć:

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) 
Powiązane problemy