systemd를 사용하여 Java 데몬 구성


11

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, 아니면주의 사항이 있습니까? 따라서 이것을 달성하는 더 안정적이고 안전한 방법이 있습니까?

답변:


14

다음은 약간의 수정 사항입니다.

  1. 네트워크 소켓에서 수신하므로의 종속성으로 만드십시오 network.target.
  2. nohupsystemd당신을 위해 실행 파일을 데몬 것이므로 필요하지 않습니다 .
  3. 별도의 셸 스크립트가 과도하다고 생각하므로 서비스 파일에 병합하십시오.
  4. < /dev/nullsystemd는 적절한 표준 I / O 컨텍스트를 설정하므로 리디렉션 등이 필요하지 않습니다. 당신이 리디렉션을 경우 실제로 에서 특별한 로깅 메커니즘과 그 저널에 자바 프로그램에 의해 표준 출력으로 전송 아무것도를 기록합니다 systemd이 필요합니다.
  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쉘해야 exec자바, 자식 프로세스로 실행하지. systemd는 기본 프로세스를 통해 서비스를 제어하며 상위 쉘 프로세스가 아닌 Java 여야합니다.
  3. 이것은 Java 실행 파일을 직접 호출하지 않으므로 systemd는 sh저널에 서비스 이름으로 이름 을 넣습니다 . 자세한 내용 은 시스템 로그에 / usr / bin / env가 실행 파일로 표시되지 않도록하는 방법을 참조하십시오 .

내가 아는 한, Systemd와 함께 Java 응용 프로그램을 실행하는 특별한주의는 없습니다.


1
작동하지 않습니다. 문제 1 : 이것은 껍질이 아닙니다. 리디렉션 연산자가 없습니다. 어쨌든 그 리디렉션을 정말로 원하지 않습니다. 문제 2 : ExecStart는 절대 경로 이름을 요구합니다. 문제 3 : unix.stackexchange.com/questions/229523
JdeBP

좋은 머리. 문제 1 만 해결할 수 있습니다. Prob 2,3 수정은 어떻게합니까?
Yun-Chih Chen

1
수정 된 답변을 참조하십시오.
JdeBP

나는 여기에 sh가 필요하다고 생각하지 않습니다.
faho

안녕하세요 @ Yun-ChihChen 어떻게 프로세스를 중지합니까. ExecStrop는 어떻게 생겼습니까? 나는 pid 파일과 함께 init.d를 사용했지만 이것이 더 쉽다는 것을 알았습니다. 그래서 나는 어떻게 그만
black sensei
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.