Jak uruchomić skrypt Pythona w tle, nawet po wylogowaniu się z SSH?


110

Mam skrypt w Pythonie bgservice.pyi chcę, aby działał przez cały czas, ponieważ jest częścią usługi sieciowej, którą buduję. Jak mogę sprawić, by działał nieprzerwanie nawet po wylogowaniu się z SSH?

Odpowiedzi:


213

Uruchom, nohup python bgservice.py &aby skrypt zignorował sygnał rozłączenia i działał dalej. Wyjście zostanie wprowadzone nohup.out.

Idealnie byłoby, gdybyś uruchomił skrypt z czymś w rodzaju, superviseaby można go było uruchomić ponownie, jeśli (kiedy) umrze.


15
kiedy uruchamiam polecenie z nohup i &, otrzymuję komunikat nohup: ignoring in put and appending output to nohup.out'`, a kiedy naciskam enter, proces kończy się ze statusem 1. Co się dzieje?
Santosh Ghimire

1
przeczytaj wynik w nohup.out. w moim przypadku był to problem z uprawnieniami, potrzebowałem użyć sudo
mxns

i jak zatrzymać usługę bgservice po jej uruchomieniu w tej metodzie?
pożar w dołku

1
@Shaegorath zapisz pid gdzieś, abyś mógł wysłać sygnały do ​​procesu później. w niektórych powłokach (bash, zsh, itp.) po wykonaniu somecommand &tej czynności wypisze pid jak [1] 12345. w przeciwnym razie możesz użyć $!.
Tony Beta Lambda

31

Jeśli już rozpocząłeś proces i nie chcesz go zabijać i uruchamiać ponownie pod nohup, możesz wysłać go do tła, a następnie wyrzec się.

Ctrl+Z (wstrzymaj proces)

bg (uruchom ponownie proces w tle

disown %1(zakładając, że jest to zadanie nr 1, użyj jobsdo określenia)



12

Możesz rozważyć przekształcenie skryptu Pythona w odpowiedniego demona Pythona, jak opisano tutaj .

python-daemon to dobre narzędzie, którego można używać do uruchamiania skryptów języka Python jako procesu demona w tle, a nie wiecznie działającego skryptu. Będziesz musiał nieco zmodyfikować istniejący kod, ale jest prosty i prosty.

Jeśli masz problemy z demonem Pythona, istnieje inny kierownik narzędzia , który zrobi to samo za Ciebie, ale w tym przypadku nie będziesz musiał pisać żadnego kodu (ani modyfikować istniejącego), ponieważ jest to gotowe rozwiązanie do demonizacji procesy.


Krótkie wyjaśnienie, w jaki sposób można rozwiązać problem, jest ogólnie dobrym pomysłem.
Nikhil Sahu


5

Oto proste rozwiązanie w Pythonie za pomocą dekoratora:

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

Możesz oczywiście zastąpić zawartość swojego bgservice.pypliku zamiast my_func.


1
Może trzeba złapać sygnał SIGHUP. Następnie dodaj signal.signal (signal.SIGHUP, handler) do swojego bloku.
Chouettou

3

Zsh powłoka posiada opcję, aby wszystkie procesy uruchomione w tle z nohup.

W ~/.zshrcdodaj linie:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

Następnie wystarczy uruchomić taki proces: python bgservice.py &i nie trzeba już używać polecenia nohup.

Wiem, że niewiele osób używa zsh, ale to naprawdę fajna powłoka, którą bym polecił.


1

Jeśli potrzebujesz, aby proces działał wiecznie, bez względu na to, czy jesteś zalogowany, czy nie, rozważ uruchomienie procesu jako demona.

supervisord to świetne, gotowe do użycia rozwiązanie, którego można użyć do demonizacji dowolnego procesu. Posiada inne narzędzie kontrolne, supervisorctlktórego można użyć do monitorowania procesów prowadzonych przez przełożonego.

Nie musisz pisać żadnego dodatkowego kodu ani modyfikować istniejących skryptów, aby to zadziałało. Co więcej, szczegółowa dokumentacja znacznie upraszcza ten proces.

Po godzinach drapania się po głowie po python-demonie, kierownik jest rozwiązaniem, które zadziałało dla mnie w ciągu kilku minut.

Mam nadzieję, że pomoże to komuś próbującemu uruchomić demona Pythona


1

Możesz także użyć Yapdi :

Podstawowe użycie:

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

Spróbuj tego:

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

Możesz uruchomić powyższe polecenie na ekranie i wyjść z ekranu.

Teraz możesz dostosować dzienniki swojego skryptu Pythona przez: tail -f <your log file>.log

Aby zabić swój skrypt, możesz użyć komend ps -aux i kill .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.