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. nohupsystemd실행 파일이 보호되므로 필요하지 않습니다 .
  3. 별도의 쉘 스크립트는 과잉이라고 생각하므로 서비스 파일에 병합하면 됩니다.
  4. 리디렉션( < /dev/nullsystemd가 적절한 표준 I/O 컨텍스트를 설정하므로 기다릴 필요가 없습니다). 실제로 리디렉션하면나가systemd는 특별한 로깅 메커니즘 없이 Java 프로그램이 표준 출력으로 보내는 모든 내용을 로그에 기록합니다.
  5. &shell() 호출에서 비동기적으로 실행하는 것은 필요하지도 적절하지도 않습니다.
  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=simpleJava 쉘 이므로 exec하위 프로세스로 실행할 수 없습니다. systemd는 기본 프로세스를 통해 서비스를 제어하며 이는 상위 셸 프로세스가 아닌 Java여야 합니다.
  3. 이는 Java 실행 파일에 대한 직접적인 호출이 아니기 때문에 systemd는 해당 이름을 sh로그에 서비스 이름으로 넣습니다. 바라보다/usr/bin/env가 시스템 로그에서 실행 파일로 표시되는 것을 방지하는 방법이에 대해 자세히 알아보세요.

내가 아는 한 Systemd를 사용하여 Java 애플리케이션을 실행할 때 특별한 경고는 없습니다.

관련 정보