Wykonywanie długotrwałego polecenia na ssh

10

Wchodzę sshna serwer i uruchamiam skrypt w języku Python, który zajmie około. 24 godziny na ukończenie. Co się stanie, jeśli moje połączenie internetowe umrze w środku? Czy to zatrzyma polecenie?

Czy jest jakiś sposób, aby uruchomić moje długo działające polecenie w taki sposób, że lokalne rozłączenia nie będą miały na niego wpływu i mógłbym nadal widzieć jego dane wyjściowe po sshponownym zalogowaniu ?

Ram Rachum
źródło

Odpowiedzi:

29

Najlepszym sposobem jest użycie screen(na serwerze), aby rozpocząć sesję, aby uruchomić polecenie, a następnie odłączyć ekran, aby nadal działał, i możesz wykonywać inne czynności lub po prostu odłączyć się od serwera. Inną opcją jest użycie nohupw połączeniu z &tak, abyś miałnohup <command> &

Zypher
źródło
Ekran. Lub możesz skonfigurować zadanie cron, jeśli jest uruchamiane więcej niż raz.
xeon,
2
Jeśli zostaniesz rozłączony, gdy jest uruchomiony na ekranie, screen -rpołączy się ponownie.
dpflug,
2

Możesz także użyć, disownjeśli już rozpocząłeś proces bez screenlubnohup

Robert Swisher
źródło
2

Istniejące odpowiedzi mogą działać dobrze, ale potrzebowałem czegoś dla BusyBox (powłoki i zestawu narzędzi dla minimalnego sprzętu, takiego jak routery domowe). Mój system nie posiada screen, dtach, at, disown, lub nawet nohup! Dzięki tbc0 na SO ( link ) znalazłem ten klejnot. Zwraca natychmiast, ale proces serwera nadal działa:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

Lub, jeśli potrzebnych jest wiele poleceń:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

Wyjaśnienie:

  • >&- - zamknąć rączkę stdout
  • 2>&- - zamknij stderr
  • <&- - zamknij standardowe wejście
  • & - umieść proces w tle

Nie używa żadnych zewnętrznych programów i powinien działać w ksh, ash, powłoce Bourne'a, bash itp.

cor
źródło
1

Jeśli proces w tle zostanie zamknięty i sesja zostanie zamknięta, proces zostanie przyjęty przez init (PID 1).

Jeśli mam sesję i wykonaj:

]$ sleep 10000 &
]$ exit

i otwórz kolejną sesję i uruchom:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

Mój proces jest nadal uruchomiony i widzimy, że jego proces nadrzędny ma teraz 1 (init).

Alternatywnie możesz skonfigurować skrypt jak demon. Szybkie wyszukiwanie pokazuje ten pozornie użyteczny link: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Jeśli chcesz przyjąć to podejście.

użytkownik51359
źródło