На сервере с Linux (Ubuntu 22.04) установлен некий демон (например, mydaemon
), который запускается через systemd unit и, согласно логам, должен работать постоянно.
❓ Но вот странность:systemctl
status mydaemon
показывает, что сервис активен.
Однако при выполнении ps aux | grep mydaemon
— процесса в списке нет.top, htop, pgrep, pidof
— тоже ничего не показывают.
Но при перезапуске systemd-сервиса (systemctl restart mydaemon)
— в логах появляется запись о запуске, ошибок нет, а поведение не меняется.
Вопрос:
что происходит и как найти реальный процесс?
Подсказки:
Изучите, куда уходит stdout/stderr
.
Подумайте, может ли ExecStart запускать shell-обёртку, а не сам процесс.
Что покажет
Подвох и решение:
```ini
Type=simple
ExecStart=/bin/bash -c 'sleep 9999'```
Systemd считает, что bash — это основной процесс (MainPID), но он сразу завершается, передав выполнение sleep. Однако поскольку Type=simple, systemd не отслеживает дочерние процессы, и MainPID исчезает — ps и pgrep по имени mydaemon ничего не покажут, а дочерний процесс (sleep 9999) работает, но под другим именем.
Решение:
Либо указать Type=forking и использовать PIDFile.
Либо не использовать bash -c, а запускать нужный бинарь напрямую.
Либо использовать Type=exec (в systemd >240) или Type=notify с proper daemon tools.