Làm cách nào để gửi Ctrl-C
đến nhiều quá trình ssh -t
trong các đối tượng Popen()
?Gửi Ctrl-C tới các quá trình từ xa bắt đầu qua tiến trình con.Popen và ssh
Tôi có một số mã Python khởi động một kịch bản trên một máy chủ từ xa:
# 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()
đó làm việc tuyệt vời, nhưng tôi cần phải khởi nhiều kịch bản trên máy chủ từ xa:
# 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()
Kết quả của việc này là Ctrl-C
không giết chết đáng tin cậy mọi thứ, và thiết bị đầu cuối của tôi luôn bị cắt xén sau đó (tôi phải chạy 'reset'). Vậy làm thế nào tôi có thể giết cả hai kịch bản từ xa khi kịch bản chính bị giết?
Lưu ý: Tôi đang cố gắng tránh đăng nhập vào máy chủ từ xa, tìm kiếm 'script.sh' trong danh sách quy trình và gửi SIGINT cho cả hai quy trình. Tôi chỉ muốn có thể nhấn Ctrl-C
trên tập lệnh khởi động và có thể giết cả hai quy trình từ xa. Một giải pháp ít tối ưu có thể liên quan đến việc xác định PID của các tập lệnh từ xa, nhưng tôi không biết cách thực hiện điều đó trong thiết lập hiện tại của mình.
Cập nhật: tập lệnh khởi động trên máy chủ từ xa thực sự khởi động một số quy trình con và khi giết ssh
sẽ giết tập lệnh từ xa ban đầu (có thể là b/c của SIGHUP), nhiệm vụ trẻ em không bị giết.
Tôi đã thay đổi tiêu đề để cái gì đó thực sự mô tả những gì bạn muốn làm. –
Không có ý tưởng nếu nó sẽ làm việc, nhưng có bạn đã cố gắng gửi kết thúc của byte văn bản "\ x03" để các subprocess? Tương đương với Ctrl-C. –
@Thomas K: Suy nghĩ tốt, nhưng tiếc là sẽ chỉ hoạt động nếu "\ x03" được gửi đến phía đầu vào của thiết bị đầu cuối được gắn vào (hoặc tất nhiên nếu chương trình diễn giải dữ liệu theo cách đó!) .. Thật đáng buồn trong trường hợp này subprocess là thông qua một đường ống chứ không phải là một thiết bị đầu cuối, do đó, việc xử lý chuyển đổi Ctrl-C thành SIGINT không có: ( – psmears