налаштувати java daemon з systemd


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. nohupне потрібен, оскільки systemdбуде демонструвати виконуваний файл для вас.
  3. Я думаю, що окремий скрипт оболонки був би надмірним, тому просто об’єднайте його у службовий файл.
  4. Перенаправлення ( < /dev/nullі так далі) не потрібно, оскільки systemd встановлює відповідний стандартний контекст вводу-виводу. Дійсно, якщо ви вийдете з переадресації , systemd запише все, що надсилається на стандартний вихід програмою Java у своєму журналі, не вимагаючи спеціального механізму реєстрації.
  5. Запуск асинхронно з викликаючої оболонки ( &) не потрібен чи доцільний.
  6. Існує конкретна модель поведінки, яка вимагається Type=forking, і якщо вона не дотримується dæmon, справи йдуть не так. Тому спробуйте для 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 було позначено у системних журналах як виконуваний файл для отримання додаткової інформації про це.

Наскільки мені відомо, немає спеціального застереження щодо запуску Java-програми із Systemd.


1
Це не вийде. Проблема 1: Це не оболонка; немає операторів перенаправлення. Ви дійсно не хочете цього переадресації. Проблема 2: ExecStart вимагає абсолютних імен. Проблема 3: unix.stackexchange.com/questions/229523
JdeBP

Гарна голова вгору. Я можу лише вирішити проблему 1. Як ви вирішите вирішити проблему 2,3?
Yun-Chih Chen

1
Дивіться відповідь у редагуванні.
JdeBP

Я не вважаю, що тут необхідне.
faho

Привіт @ Yun-ChihChen, як зупинити процес. Як виглядає ExecStrop? Я використовував init.d разом із файлом pid, але це було легше. Тому мені потрібно було переконатися, що я знаю, як зупинитися і т. Д. Спасибі
чорний сенсей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.