Сервис при запуске не выполняет “code=exited, status=203/EXEC”

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

Я создал простой скрипт для синхронизации директорий при запуске, затем создал сервис 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. Данная ошибка указывает на неудачную попытку выполнить указанный исполняемый файл, что может быть связано с несколькими факторами.

Причины и диагностика ошибки

  1. Проблемы с путём к исполняемому файлу:
    Вы указали, что скрипт sync_backup.sh работает без ошибок при его выполнении напрямую, однако при запуске как служба он не находит или не может исполнить файл. Проверьте, правильно ли укажен путь к вашему скрипту в файле сервиса.

  2. Проблемы с содержимым скрипта:
    Убедитесь, что во первом пути скрипта указана правильная "шейбанг" строка, которая указывает на то, какой интерпретатор должен использоваться для выполнения скрипта. Например, первая строка вашего скрипта должна выглядеть как:

    #!/bin/bash
  3. Проблемы с правами доступа:
    Убедитесь, что ваш скрипт имеет права на выполнение. В вашем случае права доступа уже установлены (rwxr-xr-x), что означает, что скрипт должен запускаться без проблем.

  4. Отсутствие переменной окружения и команд:
    Переменные окружения в системе systemd могут отличаться от вашего интерактивного сеанса. Например, переменные PATH могут быть ограничены. Попробуйте использовать абсолютные пути ко всем исполняемым файлам, используемым в вашем скрипте.

  5. Журнал ошибок:
    Используйте команду 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
  • Отладка:
    Если проблема продолжает существовать, добавьте временные команды логирования в ваш скрипт для выявления точек, где выполнение завершается ошибкой.

Следуя этим шагам, вы сможете диагностировать и устранить проблему с выполнением вашего сервиса. Удачи в настройке, и если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

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

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