Odpowiedzi:
Masz dwie główne opcje:
Uruchom polecenie za pomocą nohup. Spowoduje to odłączenie go od sesji i umożliwi kontynuowanie działania po rozłączeniu:
nohup pythonScript.py
Zauważ, że standardowe wyjście polecenia zostanie dołączone do pliku o nazwie, nohup.outchyba że go przekierujesz ( nohup pythonScript.py > outfile).
Użyj multipleksera ekranowego, takiego jak tmux. Umożliwi to rozłączenie się ze zdalną maszyną, ale następnie przy następnym połączeniu, jeśli uruchomisz tmux attachponownie, znajdziesz się w dokładnie tej samej sesji. Polecenie będzie nadal działać (będzie kontynuowane po wylogowaniu) i będziesz mógł zobaczyć jego stdout i stderr tak, jakbyś nigdy się nie wylogował:
tmux
pythonScript.py
Po uruchomieniu zamknij okno PuTTY. Następnie połącz ponownie następnego dnia, uruchom tmux attachponownie i wróć do miejsca, w którym zacząłeś.
disown2.screen
byobuo owijarce wokół Tmuxa lub ekranu.
screenNarzędzie, dostępne dla wszystkich dystrybucjach Linuksa, to dopuszcza.
Aby go zainstalować, uruchom apt-get install screendla dystrybucji Linuksa opartych na debie dnf install -y screenlub yum install -y screendla dystrybucji opartych
na RPM.
Używać:
$ screen
Uruchomiono nową powłokę. W tej powłoce możesz uruchomić skrypt w języku Python. Następnie można nacisnąć Ctrl+ Shift+ Apotem D. Odłączy twój terminal od powłoki, która uruchamia twój skrypt. Ponadto skrypt nadal działa w nim.
Aby zobaczyć, jak działa skrypt, możesz zadzwonić screen -r. Spowoduje to ponowne podłączenie terminala do powłoki za pomocą skryptu Python, który pozostawiłeś uruchomiony w tle.
UPD: jak wspomniał Fox, screen działa źle z systemd, ale możemy użyć systemd do uruchomienia skryptu, jak mówią w oficjalnym przykładzie .
Na przykład, jeśli skrypt jest uruchamiany przez /usr/bin/myPythonScript, możesz utworzyć plik jednostki Systemd, taki jak ten.
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
Następnie możesz uruchomić ten skrypt
# systemctl daemon-reload
# systemctl start myPythonScript
Jeśli chcesz, aby ten skrypt był uruchamiany automatycznie podczas uruchamiania systemu -
# systemctl enable myPythonScript
W dowolnym momencie możesz zobaczyć, jak działa twój skrypt
# systemctl status myPythonScript
Reklama umożliwia przeglądanie dzienników skryptu
# journalctl -u myPythonScript -e
screennie jest ładnie gra systemdw domyślnej konfiguracji. Nie wiem, czy Ubuntu używa systemd, ale warto wspomnieć o jego zachowaniu i obejściu
Większość procesów można oszukać, przekierowując jego stdout, stderr, stdin (nie wszystkie deskryptory są zawsze konieczne do przekierowania) i używając &operatora control.
Zobacz, ping example.com 1>/dev/null &czy to działa.
Oczywiście niektóre programy są bardziej wyrafinowane i wymagają takich rozwiązań, jak wspomniany @terdon, ale dobrze jest wiedzieć i używać tego, co najlepiej pasuje.
EDYCJA: jak napisano w tej odpowiedzi, zabija systemdprocesy podczas wylogowywania. Niektóre wersje systemdprocesów zabicia domyślnie podczas wylogowywania, inne nie. To zachowanie można zmienić, modyfikując /etc/systemd/logind.conf, ustawiając następującą opcję. Jak napisano, może również rozwiązać niektóre problemy, które możesz mieć z rozwiązaniami @ terdon.
z man logind.conf:
KillUserProcesses=Przyjmuje argument boolowski. Konfiguruje, czy procesy użytkownika powinny zostać zabite po wylogowaniu. Jeśli to prawda, jednostka zakresu odpowiadająca sesji i wszystkie procesy w tym zakresie zostaną zakończone. Jeśli false, zakres jest „porzucany”, patrz systemd.scope (5), a procesy nie są zabijane. Domyślnie „tak”, ale zobacz opcje
KillOnlyUsers=iKillExcludeUsers=poniżej.Oprócz procesów sesji proces użytkownika może być uruchamiany pod jednostką menedżera użytkowników użytkownik @. Usługa. W zależności od ustawień przeciągania może to umożliwić użytkownikom uruchamianie procesów niezależnie od sesji logowania. Zobacz opis
enable-lingerwloginctl(1).Zauważ, że ustawienie
KillUserProcesses=yesspowoduje uszkodzenie narzędzi takich jakscreen(1) itmux(1), chyba że zostaną one przeniesione poza zakres sesji. Zobacz przykład wsystemd-run(1).
Przeczytaj połączoną odpowiedź, aby dowiedzieć się więcej.
isatty()i wychodzi, jeśli nie jest?”
nohup.