Вопрос или проблема
У меня есть следующая служба systemd под названием startupsh.service, размещенная в /etc/systemd/system/
на моем raspberry pi с установленным raspbian.
[Unit]
Description=Служба для запуска телеграм-бота
After=graphical.target
Requires=network.target
[Service]
Type=forking
RemainAfterExit=yes
User=pi
ExecStart=/usr/bin/finder.sh &
[Install]
WantedBy=multi-user.target
Я также включил службу с помощью
sudo systemctl daemon-reload
sudo systemctl enable startupsh.service
И sudo systemctl is-enabled startupsh.service
показывает, что служба действительно включена. Более того, если я запускаю sudo systemctl start startupsh.service
, все работает, как и ожидалось. Однако, если pi перезагрузить, служба не выполняется, и sudo systemctl status startupsh.service
показывает, что служба неактивна (мертва).
Что не так при запуске? Как я могу это исправить?
Редактирование: Скрипт finder.sh выглядит следующим образом
#!/usr/bin/env bash
echo "Запуск бота..."
source /home/pi/Desktop/Airdropfinder/airdropfinderEnv/bin/activate
python /home/pi/Desktop/Airdropfinder/airdropfinder/src/telegrambot.py
Добавьте Restart=on-failure
в ваш файл единицы systemd.
Restart=
Если установлено на on-failure, служба будет перезапущена, когда процесс завершится с ненулевым кодом выхода.
Ответ или решение
Проблема: Сервис systemd не запускается при перезагрузке
В вашем случае, несмотря на то что сервис startupsh.service
корректно запускается вручную, он не активируется автоматически при перезагрузке Raspberry Pi. Чтобы решить эту проблему, необходимо понять несколько аспектов работы systemd и конфигурации вашего сервиса.
Возможные причины проблемы
-
Error Handling (Обработка ошибок): Ваша конфигурация сервиса не предусматривает перезапуск в случае сбоя. Это значит, что если при старте возникнет ошибка, сервис не будет автоматически перезапущен. Добавление строки
Restart=on-failure
в секцию[Service]
вашего unit-файла поможет решить эту проблему. -
Проблемы с зависимостями: Вы указали, что ваш сервис требует
network.target
, но этот таргет может быть не активен на момент запуска вашего сервиса. Убедитесь, что все необходимые ресурсы доступны. Можно попробовать добавитьWants=network-online.target
иAfter=network-online.target
, чтобы гарантировать, что сервис будет запускаться только после полной инициализации сети. -
Ошибки в скрипте
finder.sh
: Убедитесь, что ваш скрипт выполняется корректно. Добавление отладочной информации в скрипт, например, ведение логирования в файл, может помочь вам идентифицировать, происходит ли сбой на этапе запуска. -
Отсутствие прав доступа: Убедитесь, что пользователь
pi
имеет соответствующие права для выполнения всех команд, указанных в вашем скриптеfinder.sh
. Также проверьте права на выполнение самого скриптаfinder.sh
.
Как исправить проблему
-
Редактируйте ваш unit-файл
/etc/systemd/system/startupsh.service
, добавьте следующие строки:[Service] Type=forking RemainAfterExit=yes User=pi ExecStart=/usr/bin/finder.sh & Restart=on-failure
-
Обновите конфигурацию systemd:
sudo systemctl daemon-reload
-
Убедитесь, что включены зависимости для сети, добавьте к секции
[Unit]
следующее:[Unit] Description=Service to start telegram bot After=graphical.target network-online.target Wants=network-online.target
-
Выполните команды для включения вашего сервиса:
sudo systemctl enable startupsh.service
-
Перезагрузите систему и проверьте статус сервиса:
sudo reboot sudo systemctl status startupsh.service
-
Проверьте логи вашего скрипта и состояние сервиса. Если сервис не запустился, используйте команду
journalctl -u startupsh.service
для просмотра логов.
Следуя этим рекомендациям, вы сможете устранить неполадки, связанные с автоматическим запуском вашего systemd сервиса при перезагрузке системы. Не забывайте, что правильная диагностика проблем и обработка ошибок являются ключевыми факторами для успешного функционирования ваших скриптов и сервисов.