Назад | Перейти на главную страницу

Как научить systemd обнаруживать уже запущенный сервисный процесс?

Есть демон, который можно запустить из командной строки и из systemctl.

/etc/systemd/system/mydaemon.service содержит ExecStart = и PIDFile =, поэтому Systemd может точно определить, запущена ли служба или нет:

[Unit]
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mydaemon --no-fork
PIDFile=/var/run/mydaemon-%i.pid

[Install]
WantedBy=multi-user.target

Почему "systemctl status mydaemon" говорит, что демон остановлен, даже если он запущен?

Как научить systemd, что демон может запускаться не только через "systemctl start", но и напрямую?

Не делай этого. Всегда начинайте с systemctl. Завершите работу службы и включите ее таким образом, чтобы systemd знает об этом.

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

Ну я проверил systemd руководство и не нашел информации, как сообщить systemd о запущенном вручную процессе. Я не смотрю глубоко, но я думаю, что есть возможность сделать это, отправив сообщения на systemd насчет запуска процесса, но для меня это сложно.

systemd может отслеживать только запущенный процесс. Если другой экземпляр того же демона запускается через cmdline, systemd не знает об этом.

Теперь, даже если вы вызовете служебный файл через systemctl, ExecStart завершится ошибкой (поскольку вы уже запустили демон через cmdline), и systemd считает, что ему не удалось запустить ваш демон обратно.

Чтобы решить эту проблему, сначала убейте своего демона. Затем вызовите свой служебный файл через systemctl, чтобы перезапустить демон, статус должен быть активным.