Jak wysłać Ctrl-C
do wielu procesów ssh -t
w obiektach Popen()
?Wyślij Ctrl-C do zdalnych procesów uruchomionych za pomocą podprocesu.Popen i ssh
Mam niektóre kodu Pythona, który startuje skrypt na zdalnym hoście:
# kickoff.py
# i call 'ssh' w/ the '-t' flag so that when i press 'ctrl-c', it get's
# sent to the script on the remote host. otherwise 'ctrol-c' would just
# kill things on this end, and the script would still be running on the
# remote server
a = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'a'])
a.communicate()
że działa świetnie, ale muszę skopać wiele skryptów na zdalnym komputerze:
# kickoff.py
a = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'a'])
b = subprocess.Popen(['ssh', '-t', 'remote-host', './script.sh', 'b'])
a.communicate()
b.communicate()
Wynikiem tego jest to, że Ctrl-C
nie zabija wszystkiego w sposób niezawodny, a mój terminal jest zawsze zniekształcony (muszę uruchomić "reset"). Jak mogę zabić oba zdalne skrypty, gdy główny zostanie zabity?
Uwaga: Staram się unikać logowania do zdalnego hosta, wyszukiwania "script.sh" na liście procesów i wysyłania SIGINT do obu procesów. Chcę tylko nacisnąć Ctrl-C
w skrypcie kickoff i zabić oba zdalne procesy. Mniej optymalne rozwiązanie może polegać na deterministycznym znajdowaniu PID skryptów zdalnych, ale nie wiem, jak to zrobić w moim obecnym ustawieniu.
Aktualizacja: skrypt, który jest uruchamiany na serwerze zdalnym, uruchamia kilka procesów potomnych, a podczas usuwania ssh
zabija oryginalny skrypt zdalny (prawdopodobnie b/c SIGHUP), zadania podrzędne nie są zabijane.
Zmieniłem tytuł do czegoś, co rzeczywiście opisuje to, co chcesz robić. –
Nie wiem, czy to zadziała, ale czy próbowałeś wysłać koniec bajtu tekstowego "\ x03" do podprocesu? Odpowiada to Ctrl-C. –
@Thomas K: Dobre myślenie, ale niestety to zadziała tylko wtedy, gdy "\ x03" zostanie wysłane do wejścia terminala, do którego dołączony jest proces (lub oczywiście, jeśli program interpretuje dane w ten sposób!). niestety w tym przypadku podproces jest wykonywany przez potok, a nie przez terminal, więc nie ma tam obsługi przekształcającej Ctrl-C w SIGINT :( – psmears