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?
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)
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.
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
@daemondef 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.
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
import yapdi
daemon = yapdi.Daemon()
retcode = daemon.daemonize()# This would run in daemon mode; output is not visibleif retcode == yapdi.OPERATION_SUCCESSFUL:print('Hello Daemon')
nohup: ignoring in put and appending output to
nohup.out'`, a kiedy naciskam enter, proces kończy się ze statusem 1. Co się dzieje?somecommand &
tej czynności wypisze pid jak[1] 12345
. w przeciwnym razie możesz użyć$!
.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 tledisown %1
(zakładając, że jest to zadanie nr 1, użyjjobs
do określenia)źródło
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.
źródło
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.
źródło
Nie możesz tego zrobić, ale wolę ekran .
źródło
Oto proste rozwiązanie w Pythonie za pomocą dekoratora:
Możesz oczywiście zastąpić zawartość swojego
bgservice.py
pliku zamiastmy_func
.źródło
Zsh powłoka posiada opcję, aby wszystkie procesy uruchomione w tle z nohup.
W
~/.zshrc
dodaj linie: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ł.
źródło
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,
supervisorctl
któ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
źródło
Możesz także użyć Yapdi :
Podstawowe użycie:
źródło
Spróbuj tego:
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 .
źródło