2009-04-29 36 views
9

Tôi có một ứng dụng java sử dụng ProcessBuilder để chuẩn bị một lệnh hệ điều hành và cung cấp cho tôi một đối tượng Process. (Lệnh os thực tế là rsync trên ssh sử dụng Cygwin).Java ProcessBuilder process.destroy() không giết chết các tiến trình con trong winXP

Điều này hoạt động tốt trong Windows, tuy nhiên nếu tôi muốn ngừng quá trình sử dụng process.destroy(), nó sẽ không giết quá trình ssh và rsync con ..... Tôi phải tự tay xóa chúng bằng trình quản lý tác vụ của cửa sổ ..

Có thể lấy số OutputStream của quy trình và gửi ctrl-c bằng cách nào đó trước khi tôi gọi destroy(); không?

Nếu bất kỳ ai có bất kỳ ý tưởng nào về cách giải quyết, điều đó thật tuyệt vời. Cảm ơn, D

+1

Ctrl-C là một hàm đầu cuối gửi tín hiệu (SIGTERM?) Đến id tiến trình. Vì vậy, để mô phỏng rằng bạn cần quá trình id và để có thể gửi một tín hiệu –

Trả lời

5

Tôi cũng nghĩ rằng việc mô phỏng Ctrl-C để diệt ssh hoàn toàn có vấn đề.

Điều tôi sẽ làm, là một trong các cách tiếp cận sau. Hoặc là sử dụng lệnh windows để tìm ra con trai của ssh (đó là một chút vấn đề, vì bạn cần phải biết pid hiện tại của bạn để nhận được quy trình con của riêng bạn). Tôi tin rằng pstools của sysinternals là một công cụ dòng lệnh tốt cho phép bạn theo dõi các quá trình mồ côi. Xem this example để kiểm soát quy trình cửa sổ hoặc bằng taskList.exe (có thể cung cấp cho bạn đầu ra ở định dạng CSV BTW) hoặc bằng cách thực thi một VBScript đặc biệt.

Cách tiếp cận thứ hai là sử dụng thư viện java như winp để thực thi và kiểm soát quá trình ssh. Tôi tin rằng bạn sẽ có thể liệt kê tất cả các trẻ em của mình và buộc phải giết chúng nếu gửi thông điệp chính xác sẽ không đủ. Đây sẽ là cách tiếp cận ưa thích của tôi. Xin lưu ý rằng phương thức killRecursively thực hiện chính xác những gì bạn muốn.

Xin lưu ý rằng những cách tiếp cận đó không chỉ hiển thị cửa sổ ứng dụng của bạn. Bạn có thể gói gọn chúng trong một lớp sẽ chạy khác trên các máy tính Windows và Linux.

Xin lưu ý rằng tôi đã không cố gắng kiểm soát chi tiết các quy trình cửa sổ, vì vậy tôi không chắc chắn các giải pháp mà tôi đã tìm thấy sẽ trưởng thành như thế nào.

+0

winp dường như đã trở nên phổ biến và là một phần của Hudson (thực ra, được viết cho nó). URL java.net không giải quyết được nữa, nhưng bài viết gốc vẫn tồn tại tại https://weblogs.java.net/blog/kohsuke/archive/2008/03/introducing_win.html (lưu ý rằng một số thông tin đó là ngày, như chỉ 32bit). URL mới cho winp (có liên kết đến mvn và github) là: http://winp.kohsuke.org/ – toddkaufmann

+0

@toddkaufmann cảm ơn, đã cập nhật URL. –

0

Tôi không chắc chắn Process.destroy() nào nằm trong bìa (gửi tín hiệu hoặc tương tự?).

Những gì bạn có thể tìm thấy hoạt động tốt hơn là gọi ssh/rsync của mình trong tập lệnh shell và trả về id quá trình trên stdout và sau đó khi bạn muốn hủy quá trình, hãy thực hiện /bin/kill với id quá trình đó. Một chút lộn xộn, nhưng có lẽ đáng tin cậy hơn.

Lưu ý rằng bạn có thể /bin/kill với SIGTERM và SIGKILL nếu nó đặc biệt bướng bỉnh.

+2

Process.destroy() gọi hàm Windows TerminateProcess (http://msdn.microsoft.com/en-us/library/ms686714(VS .85) .aspx). –

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