Как изменить значение времени ожидания службы systemd?

33

В компании, в которой я сейчас работаю, есть устаревшая служба, и ее скрипт инициализации использует старый 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.

Цезарь Ральф
источник

Ответы:

55

Мой системный сервис истекал из-за того, сколько времени потребуется для загрузки, так что это исправило это для меня:

  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. Если это не сработало , попробуйте перезагрузить systemctl сsystemctl reboot
  6. Если это не сработало , попробуйте использовать --no-blockопцию для systemctl следующим образом: systemctl --no-block start node.service. Эта опция описана здесь : «Не ожидайте синхронно завершения запрошенной операции. Если это не указано, задание будет проверено, поставлено в очередь, и systemctl будет ожидать завершения запуска устройства. Передав этот аргумент, он только проверено и поставлено в очередь ".
    • Существует также возможность использовать systemctl maskвместо systemctl start. Для получения дополнительной информации см. Здесь .

Обновления от комментариев:

  • TimeoutSec=infinity: Вместо использования «бесконечности», поместите большое количество времени, например, TimeoutSec=900(15 мин). Если для выхода из приложения требуется «навсегда», возможно, оно заблокирует перезагрузку на неопределенный срок. Credit @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я мог по крайней мере увидеть тайм-аут, установленный systemd для моего сервиса.

Я изменил скрипт на обычный файл модуля, чтобы он работал правильно.

Цезарь Ральф
источник