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.out
chyba ż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 attach
ponownie, 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 attach
ponownie i wróć do miejsca, w którym zacząłeś.
disown
2.screen
byobu
o owijarce wokół Tmuxa lub ekranu.
screen
Narzędzie, dostępne dla wszystkich dystrybucjach Linuksa, to dopuszcza.
Aby go zainstalować, uruchom apt-get install screen
dla dystrybucji Linuksa opartych na debie dnf install -y screen
lub yum install -y screen
dla 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
screen
nie jest ładnie gra systemd
w 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 systemd
procesy podczas wylogowywania. Niektóre wersje systemd
procesó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-linger
wloginctl
(1).Zauważ, że ustawienie
KillUserProcesses=yes
spowoduje 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
.