Служба systemd не запускается автоматически при загрузке, служба включена.

Вопрос или проблема

Я столкнулся с проблемой с сервисом systemd, который я создал на системе Ubuntu 20.04.6, работающей на платформе ARM64. Сервис должен запускать простой Bash-скрипт при загрузке, но он не запускается автоматически. Я протестировал различные сервисы с одинаковым результатом, это просто пример. Вот подробности:

Скрипт (/home/username/test.sh):

#!/bin/bash
echo "Скрипт запущен в $(date)" >> /home/username/test_service.log

Файл сервиса (/etc/systemd/system/test_service.service):

[Unit]
Description=Тестовый сервис
After=network.target

[Service]
ExecStart=/home/username/test.sh
Restart=no
Type=oneshot
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=test_service
User=root

[Install]
WantedBy=multi-user.target

Текущий статус:

  1. Скрипт работает корректно при ручном выполнении:

    sh /home/username/test.sh
    

    Он записывает ожидаемый вывод в /home/username/test_service.log.

  2. Сервис запускается корректно при ручном вызове, и я вижу добавленную строку в журнал:

    sudo systemctl start test_service.service
    
  3. Сервис включен для запуска:

    sudo systemctl is-enabled test_service.service
    

    Вывод:

    enabled
    
  4. После загрузки для этого сервиса не записано никаких журналов:

    sudo journalctl -u test_service.service -b
    

    Вывод:

    -- Нет записей --
    
  5. Нет ошибок и журналов в journalctl

    username@hostname:~$ sudo journalctl -b | grep test_service
    Nov 22 09:38:28 hostname sudo[2264]:     username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/usr/bin/journalctl -u test_service.service -b
    username@hostname:~$ sudo systemctl start test_service.service
    username@hostname:~$ sudo journalctl -b | grep test_service
    Nov 22 09:38:28 hostname sudo[2264]:     username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/usr/bin/journalctl -u test_service.service -b
    Nov 22 09:39:19 hostname sudo[2271]:     username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/usr/bin/systemctl start test_service.service
    Nov 22 09:39:19 hostname systemd[1]: test_service.service: 
    Succeeded.
    
  6. systemctl status test_service.service:

    systemctl status test_service.service
    
    test_service.service - Тестовый сервис
      Loaded: loaded (/etc/systemd/system/test_service.service; enabled; vendor preset: enabled)
      Active: inactive (dead)
    
    

Что я пробовал:

  • Проверил, что скрипт исполняем и имеет правильные разрешения (chmod +x /home/username/test.sh).
  • Перезагрузил конфигурацию systemd с помощью sudo systemctl daemon-reload.
  • Снова включил сервис с помощью sudo systemctl enable test_service.service.
  • Проверил наличие ошибок с помощью sudo systemd-analyze verify /etc/systemd/system/test_service.service — ошибок не было найдено.

Вопросы:

  1. Почему сервис не запускается автоматически при загрузке, хотя он включен и работает нормально вручную?

Любая помощь или советы будут очень appreciated. Спасибо!

Это работает как ожидалось:

Файл юнита

$ cat /etc/systemd/system/test_service.service 
[Unit]
Description=Тестовый сервис
After=network.target

[Service]
ExecStart=bash -c 'echo "Скрипт запущен в $(date)"'
Restart=no
Type=oneshot
User=root

[Install]
WantedBy=multi-user.target

Статус сервиса

$ systemctl status test_service.service
● test_service.service - Тестовый сервис
     Loaded: loaded (/etc/systemd/system/test_service.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Mon 2024-11-25 09:10:13 CET; 1min 55s ago
    Process: 1508 ExecStart=/usr/bin/bash -c echo "Скрипт запущен в $(date)" (code=exited, status=0/SUC>
   Main PID: 1508 (code=exited, status=0/SUCCESS)

Nov 25 09:10:13 myhost systemd[1]: Starting Тестовый сервис...
Nov 25 09:10:13 myhost bash[1508]: Скрипт запущен в Mo 25 Nov 2024 09:10:13 CET
Nov 25 09:10:13 myhost systemd[1]: test_service.service: Успешно.
Nov 25 09:10:13 myhost systemd[1]: Завершено Тестовый сервис.
$ journalctl -b 0 -xefu test_service.service
-- Журналы начинаются с Mon 2024-06-24 07:53:06 CEST. --

Вывод журнала

$ journalctl -b 0 -xefu test_service.service
-- Журналы начинаются с Mon 2024-06-24 07:53:06 CEST. --
Nov 25 09:10:13 myhost systemd[1]: Starting Тестовый сервис...
-- Subject: A start job for unit test_service.service has begun execution
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- A start job for unit test_service.service has begun execution.
-- 
-- The job identifier is 225.
Nov 25 09:10:13 myhost bash[1508]: Скрипт запущен в Mo 25 Nov 2024 09:10:13 CET
Nov 25 09:10:13 myhost systemd[1]: test_service.service: Успешно.
-- Subject: Unit succeeded
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Юнит test_service.service успешно перешёл в состояние 'dead'.
Nov 25 09:10:13 myhost systemd[1]: Завершено Тестовый сервис.
-- Subject: A start job for unit test_service.service has finished successfully
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- A start job for unit test_service.service has finished successfully.
-- 
-- The job identifier is 225.

Ответ или решение

Проблема, с которой вы столкнулись, заключается в том, что служба systemd не запускается автоматически при загрузке системы на базе Ubuntu 20.04.6. Несмотря на то что служба включена и корректно работает при ручном запуске, есть несколько аспектов, которые стоит рассмотреть для устранения этой проблемы.

1. Проверка файла службы

Ваш файл службы (/etc/systemd/system/test_service.service) выглядит в целом корректно, однако обратите внимание на следующие моменты:

  • Необходимость интерпретатора: В вашем файле службы указано ExecStart=/home/username/test.sh. Это означает, что systemd попытается запустить этот скрипт напрямую. Убедитесь, что в самом начале скрипта есть шебанг (#!/bin/bash), что вы уже сделали.
  • Проблемы с окружением: Когда systemd запускает вашу службу, она может не иметь того же окружения, что и при ручном запуске. Попробуйте изменить строку ExecStart на ExecStart=/bin/bash /home/username/test.sh. Это обеспечит, что скрипт запускается с правильным интерпретатором.

2. Логи и отладка

Логи не отображаются, так как служба не выполняется во время загрузки. Вы можете проверить следующие пункты:

  • Запуск службы после загрузки: Убедитесь, что ваше задание After=network.target действительно позволяет службе запускаться при загрузке. Для одиночного скрипта, который не требует сети, может быть целесообразно удалить эту строку.
  • Права доступа к скрипту: Если ваш скрипт пытается записывать выходные данные в файл (как в вашем случае с test_service.log), необходимо убедиться, что у пользователя, от имени которого запускается служба, есть соответствующие права. По умолчанию User=root может быть излишним, так как система может не запускать службы с root в целях безопасности. Попробуйте запустить от имени обычного пользователя (например, User=username).

3. Проверка конфигурации systemd

После любых изменений в файле службы не забудьте перезагрузить конфигурацию systemd:

sudo systemctl daemon-reload

Затем проверьте состояние службы:

systemctl status test_service.service

4. Настройка WantedBy

Убедитесь, что ваша служба действительно должна запускаться на этапе загрузки. У вас уже установлено WantedBy=multi-user.target, что правильно, но для отладки вы можете попробовать также изменить на WantedBy=default.target. После внесения изменений не забудьте снова установить службу:

sudo systemctl enable test_service.service

5. Тестирование

Для окончательной проверки вы можете провести тест после изменения:

  1. Перезагрузите систему.
  2. После загрузки проверьте журнал:
sudo journalctl -u test_service.service -b

Если услуг не отображается в системных логах, это может указывать на еще одну неудачу при запуске. Попробуйте дополнительно активировать настройку для более детального логирования, добавив строки в секцию [Service]:

StandardOutput=journal
StandardError=journal

Заключение

Если после всех вышеперечисленных шагов служба все еще не стартует автоматически, просмотрите системные журналы (sudo journalctl -b) для выявления любых потенциальных конфликтов или ошибок, которые могут мешать запуску вашей службы. Проверяйте все изменения по мере их внесения и тестируйте. Эти шаги помогут вам определить источник проблемы и позволят вашей службе корректно запускаться при загрузке системы.

Оцените материал
Добавить комментарий

Капча загружается...