systemd로 Java 데몬 구성

systemd로 Java 데몬 구성

저는 systemd직업에 대해 다음 정의를 사용하고 있습니다.

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

스크립트는 다음과 같이 호출됩니다(tcpip 소켓에서 수신 대기하고 입력을 파일에 추가하는 간단한 루틴 호출).

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

프로세스가 상위 프로세스 systemctl start somejob로 실행 중인 것으로 표시된 후 :init

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

수행한 후에는 systemctl stop somejob프로세스가 더 이상 표시되지 않습니다(포트도 닫힙니다).

그래서 모든 게 괜찮아 보이고 멋있어 보여요

내 질문은 다음과 같습니다.수용 가능한 솔루션을 사용하여 Java 데몬을 실행하는 데 대한 systemd경고 사항이 있습니까? 따라서 이를 달성하기 위한 더 안정적이거나 안전한 다른 방법이 있습니까?

답변1

다음은 몇 가지 사소한 수정 사항입니다.

  1. 네트워크 소켓을 수신하므로 network.target.
  2. nohup실행 파일을 데몬화 하므로 필요하지 않습니다 systemd.
  3. 별도의 쉘 스크립트를 사용하는 것은 무리일 것이라고 생각하므로 이를 서비스 파일에 병합하면 됩니다.
  4. < /dev/nullsystemd가 적절한 표준 I/O 컨텍스트를 설정하므로 리디렉션 등 이 필요하지 않습니다. 실제로 리디렉션을 수행하면밖으로systemd는 특별한 로깅 메커니즘 없이 Java 프로그램이 표준 출력으로 보낸 모든 내용을 저널에 기록합니다.
  5. 호출하는 셸( &)에서 비동기적으로 실행하는 것은 필요하지도 적절하지도 않습니다.
  6. 에 필요한 특정 동작 패턴이 있으며 Type=forking데몬이 따르지 않으면 문제가 발생합니다. 따라서 Type=simple(또는 Type=notify)을 시도해 보십시오.

따라서 서비스 파일은 다음과 같습니다.

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

노트:

  1. java실행할 프로그램의 이름으로 만 사용할 수는 없습니다 . systemd는 실행 파일을 검색하지 않으며 PATH제공된 실행 파일 이름은 ExecStart절대적이어야 합니다. 따라서 경로 검색을 원하면 쉘이나 /usr/bin/env. 우리는 /bin/sh여기를 선택합니다.
  2. Type=simple쉘 은 execJava가 필요하므로 하위 프로세스로 실행하지 마십시오. systemd는 기본 프로세스를 통해 서비스를 제어하며 이는 상위 셸 프로세스가 아닌 Java여야 합니다.
  3. 이는 Java 실행 파일을 직접 호출하지 않기 때문에 systemd는 해당 이름을 sh서비스 이름으로 저널에 넣습니다. 보다/usr/bin/env가 시스템 로그에 실행 파일로 표시되는 것을 방지하는 방법이에 대한 자세한 내용은.

내가 아는 한, Systemd로 Java 애플리케이션을 실행할 때 특별한 주의 사항은 없습니다.

관련 정보