Вопрос или проблема
Я создал простой скрипт для синхронизации директорий при запуске, затем создал сервис sync_backup.service, который активировал с помощью
systemctl enable sync_backup.service
и запустил, но он не работает. Операционная система – Ubuntu 24.04
Linux **** 6.8.0-49-generic #49-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 4 02:06:24 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Когда я пытаюсь запустить сервис
~# systemctl start sync_backup.service
~# systemctl status sync_backup.service
× sync_backup.service
Loaded: загружен (/etc/systemd/system/sync_backup.service; enabled; preset: enabled)
Active: неудачно (Результат: код выхода) с среды 2024-11-20 23:03:55 CET; 10 секунд назад
Продолжительность: 747us
Процесс: 69146 ExecStart=/usr/local/bin/sync_backup.sh (код=завершён, статус=203/EXEC)
Основной PID: 69146 (код=завершён, статус=203/EXEC)
CPU: 557us
nov 20 23:03:55 Deskt systemd[1]: Запущен sync_backup.service.
nov 20 23:03:55 Deskt systemd[1]: sync_backup.service: Главный процесс завершился, код=завершён, статус=203/EXEC
nov 20 23:03:55 Deskt systemd[1]: sync_backup.service: Завалился с результатом 'код выхода'.
Файл:
/etc/systemd/system/sync_backup.service
:
[Unit]
After=network.target
[Service]
ExecStart=/usr/local/bin/sync_backup.sh
[Install]
WantedBy=default.target
Если я запускаю скрипт /usr/local/bin/sync_backup.sh
, он выполняется без ошибок
Любая помощь будет оценена
@waltinator
Вот вывод pathlld
:~/pathlld# ./pathlld -v /usr/local/bin/sync_backup_folders.sh
main, target=”/usr/local/bin/sync_backup_folders.sh”, startedatslash=”1″
main target=”/usr/local/bin/sync_backup_folders.sh”
Entering pathlld target=”/usr/local/bin/sync_backup_folders.sh”
pathlld, target=”/usr/local/bin/sync_backup_folders.sh”, parent=”/usr/local/bin”
Entering pathlld target=”/usr/local/bin”
pathlld, target=”/usr/local/bin”, parent=”/usr/local”
Entering pathlld target=”/usr/local”
pathlld, target=”/usr/local”, parent=”/usr”
Entering pathlld target=”/usr”
pathlld, target=”/usr”, parent=”/”
Entering pathlld target=”/”
Unwinding, target=”/”, parent=””
drwxr-xr-x 24 root root 4096 nov 10 13:07 /
/dev/sdc2 on / type ext4 (rw,relatime)
Unwinding, target=”/usr”, parent=”/”
drwxr-xr-x 13 root root 4096 nov 20 19:22 /usr
Unwinding, target=”/usr/local”, parent=”/usr”
drwxr-xr-x 10 root root 4096 ago 27 16:18 /usr/local
Unwinding, target=”/usr/local/bin”, parent=”/usr/local”
drwxr-xr-x 2 root root 4096 nov 20 23:06 /usr/local/bin
Unwinding, target=”/usr/local/bin/sync_backup_folders.sh”, parent=”/usr/local/bin”
-rwxr-xr-x 1 root root 484 nov 20 22:50 /usr/local/bin/sync_backup_folders.sh
Исполнительные окружения вашей оболочки, вызывающей скрипт оболочки, и системного сервиса, вызывающего скрипт оболочки, различаются, особенно $PATH
.
Посмотрите на результаты
echo "=== id ===";id
echo "=== set ===";set
echo "=== env ===";env | sort
echo "=== alias ===";alias
в каждом из ваших окружений.
В скриптах оболочки, вызываемых системными сервисами (вспомните о уязвимости безопасности), используйте “абсолютные пути” для программ и других файлов. “Абсолютный путь” – это путь, начинающийся с /
, например, /home/walt/bin/myprog
, а не просто myprog
.
Ваш каталог $HOME
также отличается.
Кроме того, используйте мой скрипт pathlld
https://github.com/waltinator/pathlld
, этот bash
скрипт показывает разрешения, параметры монтирования вдоль пути к объекту или объектам, чтобы проверить, что не используется флаг noexec
на ваших монтированиях.
Ответ или решение
Ситуация, с которой вы столкнулись, связана с ошибкой "code=exited, status=203/EXEC" при попытке запуска вашего сервиса sync_backup.service
в Ubuntu 24.04. Данная ошибка указывает на неудачную попытку выполнить указанный исполняемый файл, что может быть связано с несколькими факторами.
Причины и диагностика ошибки
-
Проблемы с путём к исполняемому файлу:
Вы указали, что скриптsync_backup.sh
работает без ошибок при его выполнении напрямую, однако при запуске как служба он не находит или не может исполнить файл. Проверьте, правильно ли укажен путь к вашему скрипту в файле сервиса. -
Проблемы с содержимым скрипта:
Убедитесь, что во первом пути скрипта указана правильная "шейбанг" строка, которая указывает на то, какой интерпретатор должен использоваться для выполнения скрипта. Например, первая строка вашего скрипта должна выглядеть как:#!/bin/bash
-
Проблемы с правами доступа:
Убедитесь, что ваш скрипт имеет права на выполнение. В вашем случае права доступа уже установлены (rwxr-xr-x), что означает, что скрипт должен запускаться без проблем. -
Отсутствие переменной окружения и команд:
Переменные окружения в системеsystemd
могут отличаться от вашего интерактивного сеанса. Например, переменныеPATH
могут быть ограничены. Попробуйте использовать абсолютные пути ко всем исполняемым файлам, используемым в вашем скрипте. -
Журнал ошибок:
Используйте командуjournalctl -u sync_backup.service
для получения более подробной информации о том, что происходит. Это может предоставить вам дополнительные подсказки о том, почему служба не запускается.
Доработка конфигурации сервиса
Перепишите ваш файл сервиса, чтобы убедиться, что все основные аспекты соблюдены:
[Unit]
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sync_backup.sh
WorkingDirectory=/usr/local/bin/
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Дополнительные рекомендации
-
Проверка наличия
noexec
:
Используйте ваш скриптpathlld
, чтобы удостовериться, что ни одна из точек монтирования, где расположен скрипт, не использует флагnoexec
, что может помешать выполнению. -
Тестирование:
После внесения изменений не забудьте перезапустить демона systemd с помощью команды:sudo systemctl daemon-reload
Затем попробуйте снова запустить службу:
sudo systemctl start sync_backup.service
-
Отладка:
Если проблема продолжает существовать, добавьте временные команды логирования в ваш скрипт для выявления точек, где выполнение завершается ошибкой.
Следуя этим шагам, вы сможете диагностировать и устранить проблему с выполнением вашего сервиса. Удачи в настройке, и если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.