2009-10-02 26 views
13

Tôi có một chương trình đang chạy trên một máy từ xa mà dự kiến ​​sẽ nhận SIGINT từ cha mẹ. Chương trình đó cần nhận tín hiệu đó để hoạt động chính xác. Thật không may, nếu tôi chạy quá trình đó từ xa qua SSH và gửi SIGINT, quá trình ssh tự bẫy và ngắt thay vì chuyển tiếp tín hiệu.Làm thế nào để gửi SIGINT đến một quá trình từ xa qua SSH?

Dưới đây là một ví dụ về hành vi này sử dụng GDB:

Chạy tại địa phương:

 
$ gdb 
GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul 3 01:19:56 UTC 2009) 
... 
This GDB was configured as "x86_64-apple-darwin". 
^C 
(gdb) Quit 
^C 
(gdb) Quit 
^C 
(gdb) Quit 

Chạy từ xa:

 
$ ssh foo.bar.com gdb 
GNU gdb Red Hat Linux (6.3.0.0-1.159.el4rh) 
... 
This GDB was configured as "i386-redhat-linux-gnu". 
(gdb) ^C 
Killed by signal 2. 
$ 

Ai có thể đề nghị một cách để làm việc xung quanh vấn đề này? Ứng dụng khách ssh cục bộ là OpenSSH_5.2p1.

Trả lời

21
 
$ ssh -t foo.bar.com gdb 
... 
(gdb) ^C 
Quit 
+1

Hoàn hảo. Đó là nó. Cảm ơn. – Matt

0

Bạn có thể chạy thiết bị đầu cuối trên máy từ xa và sử dụng kill -INT để gửi tín hiệu không?

1

Hãy thử signal SIGINT tại dấu nhắc gdb.

+0

Trong trường hợp của tôi chương trình từ xa không phải là GDB - Tôi chỉ sử dụng ví dụ để minh họa rằng hành vi. Xin lỗi điều đó không rõ ràng. (Quá trình từ xa thực tế là một máy chủ chơi cờ vua trên tiêu chuẩn IO.) Cảm ơn. – Matt

1

Dường như bạn đang làm ctrl + c. Vấn đề là cửa sổ terminal của bạn đang gửi SIGINT tới tiến trình ssh chạy cục bộ, không phải cho quá trình trên hệ thống từ xa.

Bạn sẽ phải chỉ định tín hiệu theo cách thủ công bằng cách sử dụng lệnh kill hoặc cuộc gọi hệ thống trên hệ thống từ xa.

hoặc thuận tiện hơn sử dụng killall

$killall -INT gdb 
+1

Thật không may, các hành vi là như nhau cho dù tôi viết một^C đến thiết bị đầu cuối hoặc tôi gửi SIGINT đến quá trình ssh bằng cách sử dụng giết. – Matt

+1

Bạn phải gửi SIGINT cho quá trình bạn muốn nhận nó, không phải phiên ssh của bạn. –

Các vấn đề liên quan