
У нас есть служба, которая управляется 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 процессу.