2012-07-21 4 views
3

데몬으로 시작되는 Java 응용 프로그램을 작성했습니다 (stderr 및 stdout을 리디렉션하고 bash를 통해 stdin을 닫습니다). 그러나 때로는이 응용 프로그램에 메시지를 보내고 동작의 특정 부분을 변경하도록 알릴 수 있기를 원합니다. 터미널에서 응용 프로그램에 메시지를 보낼 수 있어야하므로 그래픽 유틸리티가 필요한 것은 아무 것도 아닙니다.데몬 프로세스가 동작을 변경하도록 신호를 보내는 방법

행동의 변화는 매우 간단합니다. 내 응용 프로그램의 한 스레드 상태에 대한 토글과 응용 프로그램을 정상적으로 종료하는 방법이 필요합니다.

내 목표는 무엇인가? 내가 메시지에 대한 일종의 소켓에서 수신 대기하는 프로세스에서 스레드를 가질 수 있다는 것을 알고 있지만 이것은 내가 가진 필요에 과도한 것처럼 보입니다.

Linux/Unix의 신호에 너무 익숙하지 않아 일부 신호에 대해 사용자 지정 처리기를 설정하고 프로세스가 신호를 받으면 코드를 실행하도록 요청할 수 있는지 묻고 싶습니다.

내가 모르는 다른 옵션이 있습니까?

답변

3

신호가 가장 쉽습니다. 응용 프로그램에서 SIGUSR1 및 SIGUSR2를 사용할 수 있으며 토글을 관리하기위한 처리기를 작성할 수 있습니다. 일반적으로 처리기에서 많은 작업을 수행하지 않으려면 스위치를 설정하고 기본 루프 (또는 무엇이든)가 스위치를 확인하고 그에 따라 작동해야합니다. 마찬가지로 신호 수신은 사용자가 변경 한 구성 파일을 읽도록 프로그래밍 할 수 있습니다.

사용할 수있는 IPC (fifos, 소켓, MQ)를 사용할 수는 있지만 스레드 차단 기능이 있거나 select 문 (또는 그에 상응하는 Java 코드)이 포함될 수 있습니다.

+0

조심해 : JVM (적어도 오라클)은 내부 용으로 몇 가지 신호를 예약한다. –

+0

두 가지 응용 프로그램으로 응용 프로그램을 분리하여 문제를 해결했습니다. 그러나 그 전에는 필자가 필요로하는 것을하기 위해 FIFO를 사용하는 데 많은 진전을 이루었습니다. –

1

개인적으로 저는 이것을 위해 OS 신호를 사용하고 싶습니다.

java.lang.Runtime.addShutdownHook을 사용하고 SIGTERM, SIGINT 또는 SIGHUP을 보냅니다.

일부 신호는 내부 용으로 예약되어 있으므로 사용중인 JVM에 대한 문서를 확인하십시오.

SignalHandler은 지원되는 공용 인터페이스의 일부가 아니므로 마일리지가 다를 수 있습니다.

C 코드에서 JVM을 인스턴스화하려면 JVM 전에 신호 처리기 (C로 설정)를 사용하면됩니다.

+0

지원되는 공용 인터페이스의 일부가 아닌 SignalHandler에 대한 부분은 약간주의해야합니다. 코드를 깨끗하게 유지하고 특정 구현의 내부 기능에 의존하지 않으려합니다. addShutdownHook에 대해 살펴 보겠습니다. 내가하고있는 일의 일부분에 유용 할 수 있습니다. –

1

기본적으로 응용 프로그램 (서버)과 통신하는 작은 클라이언트가 필요합니다. 따라서 기본 솔루션은 일부 IPC 메커니즘을 사용해야합니다. IPC 메커니즘을 구현하는 것은 일회성 노력이며 요구 사항에 잘 맞기 때문에 문제가 될만한 가치가 있습니다. IPC에 신호를 사용하는 것은 권장되지 않습니다. 나는 소켓이 좋은 방법이라고 생각한다.

관련 문제