- Вопрос или проблема
- Скрипт (/home/username/test.sh):
- Файл сервиса (/etc/systemd/system/test_service.service):
- Текущий статус:
- Что я пробовал:
- Вопросы:
- Файл юнита
- Статус сервиса
- Вывод журнала
- Ответ или решение
- 1. Проверка файла службы
- 2. Логи и отладка
- 3. Проверка конфигурации systemd
- 4. Настройка WantedBy
- 5. Тестирование
- Заключение
Вопрос или проблема
Я столкнулся с проблемой с сервисом 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
Текущий статус:
-
Скрипт работает корректно при ручном выполнении:
sh /home/username/test.sh
Он записывает ожидаемый вывод в
/home/username/test_service.log
. -
Сервис запускается корректно при ручном вызове, и я вижу добавленную строку в журнал:
sudo systemctl start test_service.service
-
Сервис включен для запуска:
sudo systemctl is-enabled test_service.service
Вывод:
enabled
-
После загрузки для этого сервиса не записано никаких журналов:
sudo journalctl -u test_service.service -b
Вывод:
-- Нет записей --
-
Нет ошибок и журналов в 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.
-
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
— ошибок не было найдено.
Вопросы:
- Почему сервис не запускается автоматически при загрузке, хотя он включен и работает нормально вручную?
Любая помощь или советы будут очень 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. Тестирование
Для окончательной проверки вы можете провести тест после изменения:
- Перезагрузите систему.
- После загрузки проверьте журнал:
sudo journalctl -u test_service.service -b
Если услуг не отображается в системных логах, это может указывать на еще одну неудачу при запуске. Попробуйте дополнительно активировать настройку для более детального логирования, добавив строки в секцию [Service]
:
StandardOutput=journal
StandardError=journal
Заключение
Если после всех вышеперечисленных шагов служба все еще не стартует автоматически, просмотрите системные журналы (sudo journalctl -b
) для выявления любых потенциальных конфликтов или ошибок, которые могут мешать запуску вашей службы. Проверяйте все изменения по мере их внесения и тестируйте. Эти шаги помогут вам определить источник проблемы и позволят вашей службе корректно запускаться при загрузке системы.