Может ли другой процесс подать сигнал systemd о необходимости перезапустить службу?

Может ли другой процесс подать сигнал systemd о необходимости перезапустить службу?

У нас есть служба, которая управляется systemd. Я ищу способ программного перезапуска этой службы по требованию — например, отправкой сигнала, записью в файл или отправкой сообщений через сокет.

Контекст: systemdуправляемая служба поддерживает пул экземпляров headless chrome. Но она управляет ими довольно плохо, и со временем их число и использование памяти увеличиваются. A systemctl restartисправляет это.

Я мог бы настроить RuntimeMaxSecи Restart=alwaysпериодически перезапускать прокси-сервер, но в момент перезапуска он может выполнять работу.

Другая служба на этой машине является единственным потребителем прокси-сервера Chrome и знает, когда он его не использует. Поэтому периодически, когда он не использует прокси-сервер Chrome (чтобы не было сброшено ни одного запроса), он может перезапустить его.

Как я мог это сделать?

решение1

Одно из решений — запустить другую службу systemctl restart some_service. Для этого требуется sudo, но можно использовать sudoersфайл ( visudo), чтобы дать пользователю разрешение на запуск одной конкретной команды:some-user ALL=NOPASSWD: /some/command some args

решение2

Если вы хотите избежать sudo, вы можете установить флаг задержки пользователя и создать пользовательскую службу вместо системной. Это может не работать на Centos 7 или ниже.

Другое решение — спросить у systemctl, какой у него PID.

systemctl --user status your_scraper

затем отправьте SIGHUP этому идентификатору процесса

os.kill(main_pid_of_your_scraper, signals.SIGHUP)

которые вам нужно перехватить внутри вашего приложения и сбросить настройки браузера.

signal.signal(signal.SIGHUP, restart_myself)

Это также хорошо работает с systemcl, поскольку systemctl reloadтакже отправляет сигнал SIGHUP процессу.

Связанный контент