Java 코드를 사용하여 Windows에서 애플리케이션을 중지 할 수 있습니까? 내 PC에서 응용 프로그램을 중지하는 바로 가기와 같은 프로그램을 만들고 싶습니다. ProcessBuilder를 사용할 수 있습니까? 고맙습니다.Java 코드로 애플리케이션 종료/중지
답변
자바 코드를 사용하여 Windows에서 응용 프로그램을 중지 할 수 있습니까? ... ProcessBuilder를 사용할 수 있습니까?
채우려는 동일한 Java 응용 프로그램에서 응용 프로그램을 시작한 경우에만.
그 외의 경우 Windows 전용 명령을 실행하여 JNI에 기반한 죽임 작업을 수행하여 네이티브 Windows 라이브러리 호출을 작성해야합니다.
다른 문제는 사용 권한 문제로 인해 특정 프로세스를 죽일 수 없으며 일부 프로세스가 죽기를 거절 할 수도 있다는 것입니다.
JRE가 시스템 프로세스 용 API를 제공하지 않는다고 생각합니다. ProcessBuilder
수 시스템 프로세스를 만들지 만 JVM 외부에서 생성 된 프로세스에 대해서는 Process
개체를 제공 할 수 없습니다. 필자는 가능한 경우 특정 OS 관련 작업을 피하기 위해 Java 사람들의 철학적 결정이라고 생각합니다. 모든 운영체제에 pid가 있거나 모든 kill 메시지가 있다고 생각할 수도 있지만 Java는 많은 OS에서 실행됩니다. 그 중 일부는 매우 이상합니다.
네이티브 코드를 작성하여 JNI로 랩핑 할 수 있지만 낭비가 될 수 있습니다. Mr 988052가 말하듯이 Runtime.exec
또는 ProcessBuilder
을 통해 시스템 특정 명령을 실행하는 것이 좋습니다. 어떤 운영 체제를 지원할지 결정해야하며 각 운영 체제에 적합한 명령 (및 OS 감지 코드)을 가져야합니다.
일반 자바없이 액세스 할 수 있습니까? 아니요
ProcessBuilder를 사용하면 Java 응용 프로그램 내에서 시작한 프로세스를 제어 할 수 있지만 다른 프로세스에서 시작된 프로세스를 제어 할 수는 없습니다.
user988052 님의 의견에 따르면 Sysinternals Suite에서 pskill
을 사용하면 Runtime.exec
을 통해이를 수행 할 수 있습니다. pskill
은 TerminateProcess 함수 호출을 사용합니다. JNI (또는 JNA, NLink 등의 다른 기본 호출자)와 함께이 함수를 호출 할 수도 있지만 OpenProcess 함수 호출을 통해 프로세스에 대한 핸들을 얻어야합니다.
OpenProcess를 사용하는 경우 dwDesiredAccess에서 PROCESS_TERMINATE (0x0001)를 요청해야합니다. – user314104
- 1. Java 바이트 코드로 클래스
- 2. Java 코드로 캐싱
- 3. Facelets를 Java 코드로 컴파일
- 4. 코드로 애플리케이션 이름을 얻는 방법은 무엇입니까?
- 5. 기존 cpp 코어 코드로 웹 애플리케이션 구축하기
- 6. Java 데스크톱 애플리케이션 성능을 모니터링하는 모니터링 애플리케이션
- 7. Google 애플리케이션 엔진 Java 용 애플리케이션 모니터링
- 8. 그래픽 인텐시브 애플리케이션 (Java)
- 9. Java mbean 애플리케이션
- 10. Websphere Java 애플리케이션 시작
- 11. 코드로 Java 주석을 검색하려면 어떻게해야합니까?
- 12. Java 코드로 Jtextfield의 값을 사용합니다.
- 13. Java 코드로 Jar 파일을 사용합니다.
- 14. Java Standard Edition에서 Java Mobile 애플리케이션 실행
- 15. Android에서 Java 애플리케이션 실행 VMware
- 16. MyEclipse, Java - 웹 애플리케이션 초보자
- 17. Java Spring 애플리케이션 프로파일 링
- 18. Eclipse에서 Java Spring 애플리케이션 실행
- 19. Java EE로 채팅 애플리케이션 구현
- 20. Freeze 모드의 Java-ME 애플리케이션
- 21. Java 웹 애플리케이션 미디어 디렉토리
- 22. Java 웹 애플리케이션 프로파일 링
- 23. Java AWT 애플리케이션 윈도우 패딩
- 24. 소스 코드로 돌아 가기 위해 애플리케이션 바이너리를 디 컴파일하십시오
- 25. JRuby에서 Java 코드로 메소드를 호출하려면 어떻게해야합니까?
- 26. MySQL의 mysqldump가 Win7에서 Java 코드로 발행되었습니다.
- 27. 이 방정식을 2D Java 코드로 작성하는 방법
- 28. C++에서 Java 코드로 변환 : numberToBarcode()
- 29. 암호화 키를 Java 코드로 저장 하시겠습니까?
- 30. 자동 완성 코드로 Java 맞춤법 검사
* Runtime.exec *을 사용하여 * pskill * Windows 유틸리티 (그 중 하나가 아직 주위에 있는지 여부는 알 수 없음)에 대한 호출을 포장하여이 작업을 수행했습니다. 그러나 나는 OS가 * pskill *과 관련이 있음을 보장하지 않습니다. Windows에서 AFAICT는 Un * x보다 훨씬 다릅니다. Un * x에서 * SIGKILL *을 발행하면 ** 프로그램이 즉시 종료되어야하고 ** 모든 리소스 **가 OS에 제공되어야 함을 의미합니다 (이는 이론이며 실제로는 잘 작동합니다). – TacticalCoder
TerminateProcess와 NtTerminateProcess는 NT에서 SIGKILL을 전송하는 것과 유사합니다. 즉, (Linux와 Windows의 경우, 아마도 대부분 * nix의 경우) 특정 프로세스를 액세스하는 프로세스로 인해 지연 될 수 있지만 OS에 프로세스를 "즉시"종료하도록 요청합니다 시스템 자원 (절대로 반환하지 않는 IO 호출). Windows에서 SIGTERM과 유사한 것은 응용 프로그램이 서비스가 아닌 한 응용 프로그램의 창에 WM_CLOSE 창 메시지를 보내는 것입니다. 이 경우 ControlService를 dwControl = SERVICE_CONTROL_STOP과 함께 사용하십시오. – user314104