Як змінити значення тайм-ауту служби systemd?


33

У компанії, в якій я зараз працюю, є застаріла служба, і її сценарій init використовує старий SysvInit, але працює над systemd (CentOS 7).

Оскільки обчислень багато, для завершення цієї послуги потрібно близько 70 секунд. Я не налаштовував жодного тайм-ауту для systemd і не змінював конфігурації за замовчуванням на /etc/systemd/system.conf, але все ж, коли я виконую service SERVICE stopсвою службу, час закінчується через 60 секунд.

Перевірившись, чи journalctl -b -u SERVICE.serviceя знайду цей журнал:

Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]

Я вже спробував змінити DefaultTimeoutStopSecвластивість при /etc/systemd/system.confдо 90s, але тайм - аут до сих пір відбувається.

Хто-небудь має уявлення, чому це тайм-аут у 60-х? Чи десь інше налаштовано це значення тайм-аута? Чи є спосіб я це перевірити?

Ця послуга працює з java 7, і щоб її демонізувати , вона використовує JSVC . Я налаштував -waitпараметр зі значенням 120.

Відповіді:


54

Мій системний сервіс продовжував вимикатися через те, скільки часу також потребуватиме завантаження, тому це вирішило для мене:

  1. Редагуйте системний файл:
    • Для сучасних версійsystemd : Запустіть systemctl edit --full node.service( замініть "вузол" своїм іменем служби ).
      • Це створить системний файл у /etc/systemd/system/node.service.d/ який замінить системний файл на /usr/lib/systemd/system/node.service. Це правильний спосіб налаштування системних файлів. Більш детальна інформація про те , як використовувати systemctl editце тут .
    • Безпосереднє редагування системного файлу : Системний файл для мене знаходиться на /usr/lib/systemd/system/node.service. Замініть "вузол" на ім'я програми. Однак безпосередньо редагувати файли в ньому не безпечно /usr/lib/systemd/(Див. Коментарі)
  2. Використовувати TimeoutStartSec,TimeoutStopSec або TimeoutSec(докладніше тут ) , щоб визначити , скільки часу тайм - аут повинен бути для запуску і зупинки процесу. Згодом ось так виглядав мій системний файл:

    [Unit]
    Description=MyProject
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/myproject/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    • Ви також можете переглянути поточний стан очікування, виконавши будь-який із них (але вам потрібно буде відредагувати службу, щоб внести зміни! Див. Крок 1):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. Далі вам потрібно буде перезавантажити systemd systemctl reload node.service
  4. Тепер спробуйте почати свою послугу systemctl start node.service
  5. Якщо це не вийшло , спробуйте перезавантажити systemctlsystemctl reboot
  6. Якщо це не спрацювало , спробуйте скористатися --no-blockпараметром для systemctl, як-от так:systemctl --no-block start node.service . Цей параметр описаний тут : "Не синхронно чекайте завершення запитуваної операції. Якщо це не вказано, завдання буде перевірено, зафіксовано і systemctl буде чекати, поки запуск блоку буде завершено. Передаючи цей аргумент, він є лише перевіреним і заповненим ".
    • Існує також можливість використовувати systemctl maskзамість systemctl start. Детальніше дивіться тут .

Оновлення з коментарів:

  • TimeoutSec=infinity: Замість того, щоб використовувати тут "нескінченність", приділіть їй велику кількість часу, наприклад TimeoutSec=900(15 хв). Якщо програмі потрібно "назавжди" вийти, то, можливо, вона буде блокувати перезавантаження на невизначений термін. Кредит @Alexis Wilke та @JCCyC
  • Замість редагування /usr/lib/systemd/systemспробуйте systemctl editзамість цього або редагувати, /etc/systemd/systemщоб замінити їх замість. Ніколи не слід редагувати сервісні файли в /usr/lib/. Кредит @ryeager та @ 0xC0000022L

8
TimeoutSec=infinity- чи не вдалося б цей блок перезавантажити на невизначений термін? Що робити, якщо для цього процесу потрібно "назавжди"? Я б запропонував велику суму, як 5min, але, мабуть, ні infinity...
Алексіс Вілке

6
вам не слід редагувати сервісні файли в / usr / lib, ви повинні їх редагувати або переопределяти в / etc / systemd / system
ryeager

5
Хоча суть порад звучить, я повинен погодитися з @ryeager ... сучасними версіями systemdпропозиції systemctl editmaskвідключити їх з грубою силою, на відміну від них disable) саме для цієї мети. Ніколи не слід редагувати файли в /usr/lib/systemd.
0xC0000022L

3
TimeoutSec=infinityтут не працювало, я використовував TimeOutSec=900(15 хв), і це врятувало мою задню частину . - Мені потрібно було запуститись systemctl daemon-reloadпісля того, як перезапустити послугу.
JCCyC

10

Біг systemctl show SERVICE_NAME.service -p TimeoutStopUSec я міг принаймні побачити час очікування, встановлений системою для моєї служби.

Я змінив сценарій на звичайний файл одиниці, щоб він нормально працював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.