2009-04-29 3 views
9

ProcessBuilder을 사용하여 운영 체제 명령을 준비하는 Java 응용 프로그램을 가지고 있고 Process 개체를 제공합니다. (실제 os 명령은 cygwin을 사용하는 ssh를 통한 rsync입니다.)Java ProcessBuilder process.destroy()가 winXP에서 자식 프로세스를 종료하지 않음

이것은 Windows에서 잘 작동하지만, process.destroy()을 사용하여 프로세스를 중지하려면 자식 ssh 및 rsync 프로세스를 죽이지 않습니다 ..... Windows 작업 관리자를 사용하여 수동으로 삭제해야합니다.

destroy();을 호출하기 전에 OutputStream 프로세스를 가져 와서 ctrl-c를 보낼 수 있습니까?

누군가 해결 방법에 대한 아이디어가 있다면 좋을 것입니다. 감사합니다, D

+1

Ctrl-C는 프로세스 ID에 신호 (SIGTERM?)를 보내는 터미널 기능입니다. 따라서 프로세스 id가 필요하고 신호를 보낼 수 있도록 에뮬레이트하려면 –

답변

5

나는 또한 ssh를 완전히 죽이기 위해 Ctrl-C를 에뮬레이트하는 것이 문제가 있다고 생각한다.

나는 다음과 같은 접근법 중 하나입니다. ssh의 아들이 누구인지 알아 내기 위해 windows 명령을 사용하십시오 (자신의 자식 프로세스를 받기 위해 현재 PID를 알아야하기 때문에 조금 문제가 있습니다). sysinternals의 pstools은 고아 프로세스를 추적 할 수있는 좋은 명령 줄 도구입니다. taskList.exe (CSV 형식 BTW로 출력 할 수 있음) 또는 특수 VBScript를 실행하여 Windows 프로세스를 제어하려면 this example을 참조하십시오.

두 번째 방법은 과 같은 Java 라이브러리를 사용하여 ssh 프로세스를 실행하고 제어하는 ​​것입니다. 올바른 메시지를 보내는 것으로 충분하지 않으면 모든 자녀를 나열하고 강제로 죽일 수 있다고 생각합니다. 이것은 내가 선호하는 접근 방법이다. killRecursively 방법은 원하는대로 정확하게 처리됩니다.

이러한 방법으로는 응용 프로그램 창만 렌더링하면 안됩니다. Windows 및 Linux 시스템에서 다르게 실행되는 클래스에 이들을 캡슐화 할 수 있습니다.

Windows 프로세스에서 세분화 된 컨트롤을 얻으려고하지 않았으므로 발견 한 솔루션이 얼마나 성숙한 것인지 잘 모르겠습니다.

+0

winp는 인기에서 성장한 것으로 보이며 허드슨 (실제로는 그것을 위해 작성되었습니다)의 일부입니다. java.net URL은 더 이상 해결되지 않지만 원본 기사는 https://weblogs.java.net/blog/kohsuke/archive/2008/03/introducing_win.html에 계속 존재합니다 (일부 정보는 32 비트처럼). winp (mvn 및 github에 대한 링크가있는)의 새 URL은 다음과 같습니다. http://winp.kohsuke.org/ – toddkaufmann

+0

@toddkaufmann 감사합니다. URL을 업데이트했습니다. –

0

Process.destroy()가 커버 아래에서 무엇을하는지 확신하지 못합니다 (신호 등을 보냅니 까?).

쉘 스크립트 내에서 ssh/rsync를 호출하고 stdout에 프로세스 ID를 반환 한 다음 프로세스를 종료하려면 해당 프로세스 ID로 /bin/kill을 수행하십시오. 좀 지저분한,하지만 아마도 더 신뢰할 수 있습니다.

특히 고집이 있다면 /bin/kill을 SIGTERM으로, SIGKILL로 지정할 수 있습니다.

+2

Process.destroy()는 Windows 함수를 호출합니다. TerminateProcess (http://msdn.microsoft.com/en-us/library/ms686714(VS) .85) .aspx). –

관련 문제