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?

zihaoyu
źródło

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.

Edward Dale
źródło
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)

Bednarz
źródło
17

Możesz także użyć ekranu GNU, który powinien mieć prawie każdy system Linux / Unix.

Jeśli korzystasz z Ubuntu / Debiana, jego ulepszona wersja byobu też jest całkiem fajna.

Dirk Eddelbuettel
źródło
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.

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

Nie możesz tego zrobić, ale wolę ekran .

Randy Proctor
źródło
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.

Chouettou
źródło
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ł.

jonescb
źródło
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

Nikhil Sahu
źródło
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')
Victor Mendonça Nogueira
źródło
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 .

Sushil Verma
źródło