Einen lang laufenden Befehl auf ssh ausführen

10

Ich gehe sshauf einen Server und starte ein Python-Skript, das ca. 24 Stunden zu vervollständigen. Was ist, wenn meine Internetverbindung in der Mitte unterbrochen wird? Wird das den Befehl stoppen?

Gibt es eine Möglichkeit, meinen Befehl mit langer Laufzeit so auszuführen, dass lokale Verbindungsabbrüche ihn nicht beeinträchtigen und ich seine Ausgabe weiterhin sehen kann, nachdem ich mich erneut angemeldet habe ssh?

Ram Rachum
quelle

Antworten:

29

Der beste Weg ist, screen(auf dem Server) eine Sitzung zu starten, in der der Befehl ausgeführt wird, und dann den Bildschirm zu trennen, damit er weiter ausgeführt wird, und Sie können andere Dinge tun oder einfach die Verbindung zum Server trennen. Die andere Möglichkeit ist die Verwendung nohupin Kombination mit &so würden Sie habennohup <command> &

Zypher
quelle
Bildschirm. Oder Sie können eine Cron-Aufgabe einrichten, wenn Sie sie mehrmals ausführen.
Xeon
2
Wenn Sie die Verbindung trennen, während es auf dem Bildschirm ausgeführt wird, screen -rwerden Sie erneut verbunden.
dpflug
2

Sie können auch verwenden, disownwenn Sie den Prozess bereits ohne screenoder gestartet habennohup

Robert Swisher
quelle
2

Die vorhandenen Antworten können gut funktionieren, aber ich brauchte etwas für BusyBox (eine Shell und eine Reihe von Tools für minimale Hardware wie Heimrouter). Mein System nicht screen, dtach, at, disown, oder sogar nohup! Dank tbc0 auf SO ( Link ) habe ich dieses Juwel gefunden. Es wird sofort zurückgegeben, aber der Serverprozess wird weiterhin ausgeführt:

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

Oder wenn mehrere Befehle benötigt werden:

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

Erläuterung:

  • >&- - Standardgriff schließen
  • 2>&- - stderr schließen
  • <&- - stdin schließen
  • & - Prozess in den Hintergrund stellen

Dies verwendet keine externen Programme und sollte über ksh, ash, Bourne Shell, Bash usw. funktionieren.

cor
quelle
1

Wenn Sie einen Prozess im Hintergrund ausführen und Ihre Sitzung schließen, wird der Prozess von init (PID 1) übernommen.

Wenn ich eine Sitzung habe und mache:

]$ sleep 10000 &
]$ exit

und öffnen Sie eine andere Sitzung und führen Sie Folgendes aus:

]$ 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

Mein Prozess läuft noch und wir sehen, dass sein übergeordneter Prozess jetzt 1 (init) ist.

Alternativ können Sie Ihr Skript wie einen Daemon einrichten. Eine schnelle Suche zeigt diesen scheinbar nützlichen Link: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Wenn Sie diesen Ansatz wählen wollten.

user51359
quelle