2011-12-06 2 views
2

Java 코드를 사용하여 Windows에서 애플리케이션을 중지 할 수 있습니까? 내 PC에서 응용 프로그램을 중지하는 바로 가기와 같은 프로그램을 만들고 싶습니다. ProcessBuilder를 사용할 수 있습니까? 고맙습니다.Java 코드로 애플리케이션 종료/중지

+1

* Runtime.exec *을 사용하여 * pskill * Windows 유틸리티 (그 중 하나가 아직 주위에 있는지 여부는 알 수 없음)에 대한 호출을 포장하여이 작업을 수행했습니다. 그러나 나는 OS가 * pskill *과 관련이 있음을 보장하지 않습니다. Windows에서 AFAICT는 Un * x보다 훨씬 다릅니다. Un * x에서 * SIGKILL *을 발행하면 ** 프로그램이 즉시 종료되어야하고 ** 모든 리소스 **가 OS에 제공되어야 함을 의미합니다 (이는 이론이며 실제로는 잘 작동합니다). – TacticalCoder

+0

TerminateProcess와 NtTerminateProcess는 NT에서 SIGKILL을 전송하는 것과 유사합니다. 즉, (Linux와 Windows의 경우, 아마도 대부분 * nix의 경우) 특정 프로세스를 액세스하는 프로세스로 인해 지연 될 수 있지만 OS에 프로세스를 "즉시"종료하도록 요청합니다 시스템 자원 (절대로 반환하지 않는 IO 호출). Windows에서 SIGTERM과 유사한 것은 응용 프로그램이 서비스가 아닌 한 응용 프로그램의 창에 WM_CLOSE 창 메시지를 보내는 것입니다. 이 경우 ControlService를 dwControl = SERVICE_CONTROL_STOP과 함께 사용하십시오. – user314104

답변

0

자바 코드를 사용하여 Windows에서 응용 프로그램을 중지 할 수 있습니까? ... ProcessBuilder를 사용할 수 있습니까?

채우려는 동일한 Java 응용 프로그램에서 응용 프로그램을 시작한 경우에만.

그 외의 경우 Windows 전용 명령을 실행하여 JNI에 기반한 죽임 작업을 수행하여 네이티브 Windows 라이브러리 호출을 작성해야합니다.

다른 문제는 사용 권한 문제로 인해 특정 프로세스를 죽일 수 없으며 일부 프로세스가 죽기를 거절 할 수도 있다는 것입니다.

0

JRE가 시스템 프로세스 용 API를 제공하지 않는다고 생각합니다. ProcessBuilder 시스템 프로세스를 만들지 만 JVM 외부에서 생성 된 프로세스에 대해서는 Process 개체를 제공 할 수 없습니다. 필자는 가능한 경우 특정 OS 관련 작업을 피하기 위해 Java 사람들의 철학적 결정이라고 생각합니다. 모든 운영체제에 pid가 있거나 모든 kill 메시지가 있다고 생각할 수도 있지만 Java는 많은 OS에서 실행됩니다. 그 중 일부는 매우 이상합니다.

네이티브 코드를 작성하여 JNI로 랩핑 할 수 있지만 낭비가 될 수 있습니다. Mr 988052가 말하듯이 Runtime.exec 또는 ProcessBuilder을 통해 시스템 특정 명령을 실행하는 것이 좋습니다. 어떤 운영 체제를 지원할지 결정해야하며 각 운영 체제에 적합한 명령 (및 OS 감지 코드)을 가져야합니다.

3

일반 자바없이 액세스 할 수 있습니까? 아니요

ProcessBuilder를 사용하면 Java 응용 프로그램 내에서 시작한 프로세스를 제어 할 수 있지만 다른 프로세스에서 시작된 프로세스를 제어 할 수는 없습니다.

user988052 님의 의견에 따르면 Sysinternals Suite에서 pskill을 사용하면 Runtime.exec을 통해이를 수행 할 수 있습니다. pskillTerminateProcess 함수 호출을 사용합니다. JNI (또는 JNA, NLink 등의 다른 기본 호출자)와 함께이 함수를 호출 할 수도 있지만 OpenProcess 함수 호출을 통해 프로세스에 대한 핸들을 얻어야합니다.

+0

OpenProcess를 사용하는 경우 dwDesiredAccess에서 PROCESS_TERMINATE (0x0001)를 요청해야합니다. – user314104

관련 문제