2013-08-11 4 views
0

독립 실행 형 Java 응용 프로그램이 있습니다. 현재이 자바 애플리케이션은 Windows에서 시작 스크립트 (startApplicatoin.bat)를 사용하고 Linux에서는 startApplicatoin.sh를 사용하여 클래스 경로를 설정 한 다음 java -classpath를 실행하여 실행합니다.외부 스크립트에서 Java 응용 프로그램 시작/중지

이제 stopApplication.bat 및 stopApplication.sh 스크립트를 추가해야합니다. 이 중지 스크립트는 정상적으로이 Java 응용 프로그램을 종료/종료해야합니다.

내가 다음 단계를 계획하고이를 달성하기

1 내 자바 응용 프로그램이 알려진 파일에서는 MyApplication에 즉 파일에 실행 된 응용 프로그램의 프로세스 ID를 저장합니다 실행

. pid.

프로세스 ID를 얻기 위해 ManagementFactory.getRuntimeMXBean(). getName() 호출은 Linux와 Windows 모두에서 작동합니다. 그래서 나는 이런 식으로 프로세스 ID를 수집하고이를 myapplication.pid라는 지정된 파일에 저장합니다.

2. 그런 다음 응용 프로그램 중지 스크립트를 실행하면이 스크립트는 해당 myapplication.pid 파일에 지정된 process-id에 "kill"요청을 발행합니다.

Windows의 경우 "taskkill"명령을 실행하여이 응용 프로그램을 중지해야합니다. 그리고 리눅스 환경에서는 "kill"명령이 그 목적을 달성 할 것입니다.

그리고 내 Java 코드에서 addShutdownHook을 추가하여 실행하려는 정상적인 종료 작업을 가능하게 할 것입니다. 즉,이 프로그램이 중단되기 전에 내가 원하는 모든 것을 처리해야합니다.

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

지금 내가 생각하고 길을 보장하기 위해 온 전성 검사를 수행하고 싶은 것은 할 수있는 적절한 방법입니다. 아니면 이것을 할 수있는 더 좋은 방법이 있습니다. 모든 제안을 부탁드립니다. 그리고 미리 감사드립니다.

답변

1

"정상적인"종료를 원할 경우 장시간 실행되는 프로세스에서 소켓을 열고 "정지"스크립트를 연결하여 종료 명령; 애플리케이션 전반적인 구조에 따라 JMX를 통해 실용적 일 수도 있습니다. OS와의 상호 작용을 요구하기보다는 "인라인"인 접근 방식은 일반적으로 추론하고 테스트하기가 더 쉽습니다.

1

이것은 Daemon처럼 보입니다.

스크립트의 에 의존하지 않고 시작/중지 기능으로 데몬을 실행하는 가장 쉬운 방법은 jsvc입니다.여기 열려있는 구성 파일 추적 파일을 작성, ServerSocket의, Thread

  • void start() 만들 :

    • void init(String[] arguments) : 동의의 Thread를 시작 들어오는 연결
    • 를이 코드는 네 가지 방법으로 인터페이스를 구현할 수 있습니다
    • void stop() :에서 만든 모든 개체를 파괴하십시오 ServerSocket
    • void destroy()을 닫으 run()을 종료 할 Thread을 알린다

    그런 다음 프로세스를 추적하고 요청할 때 프로세스를 추적하는 플랫폼 전용 바이너리가 있습니다.

    가장 유용한 점은 jsvc가 프로세스를 수퍼 유저 (유닉스에서는 루트)로 시작한 다음 peon 사용자에게 프로세스의 경매 실행을 위임 할 수 있다는 것입니다.

    Tomcat이 작동하는 방식으로 루트로 시작하여 포트 80에 바인딩하는 것과 같은 권한있는 작업을 수행합니다. 그런 다음 보안상의 이유로 peach 사용이 tomcat으로 떨어집니다.

  • +0

    사용자 이름을 좋아합니다. 답변도 좋습니다 ;-) – GojiraDeMonstah

    관련 문제