Исправление сбоя службы systemd 203/EXEC (такого файла или каталога нет)

Я пытаюсь настроить простой системный таймер для запуска bash-скрипта каждый день в полночь.

systemctl --user status backup.service терпит неудачу и регистрирует следующее:

backup.service: Failed at step EXEC spawning /home/user/.scripts/backup.sh: No such file or directory.

backup.service: Main process exited, code=exited, status=203/EXEC
Failed to start backup.
backup.service: Unit entered failed state.
backup.service: Failed with result 'exit-code'.

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

Немного предыстории:

backup.timer а также backup.service Единичные файлы находятся в /home/user/.config/systemd/user,

backup.timer загружен и активен, и в настоящее время ждет полночь.

Вот как это выглядит:

[Unit]
Description=Runs backup at 0000

[Timer]
OnCalendar=daily
Unit=backup.service

[Install]
WantedBy=multi-user.target

Вот backup.service:

[Unit]
Description=backup

[Service]
Type=oneshot
ExecStart=/home/user/.scripts/backup.sh

[Install]
WantedBy=multi-user.target

И, наконец, это парафраз backup.sh:

#!/usr/env/bin bash

rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/

Сценарий работает нормально, если я сам его выполню.

Не уверен, если это имеет значение, но я использую fish как моя оболочка (началось с.bashrc).

Я рад опубликовать полный сценарий, если это полезно.

8 ответов

Решение

Я думаю, что нашел ответ:

в .service файл, мне нужно было добавить /bin/bash до пути к сценарию.

Например, для backup.service:

ExecStart=/bin/bash /home/user/.scripts/backup.sh

В отличие от:

ExecStart=/home/user/.scripts/backup.sh

Я не уверен почему. возможно fish, С другой стороны, у меня есть другой скрипт для моей электронной почты, и сервисный файл, кажется, работает нормально без /bin/bash, Это использует default.target вместо multi-user.target, хоть.

Большинство учебных пособий, с которыми я сталкивался, не предшествуют /bin/bash, но потом я увидел этот ТАК ответ, в котором он был, и решил, что стоит попробовать.

Служебный файл выполняет сценарий, а таймер указан в systemctl --user list-timersНадеюсь, это сработает.

Обновление: я могу подтвердить, что все работает сейчас.

Чтобы упростить, убедитесь, что добавили хэш-удар в начало вашего скрипта ExecStart, т.е.

#!/bin/bash

python -u alwayson.py    

Я столкнулся с Main process exited, code=exited, status=203/EXEC и сегодня, и моя ошибка заключалась в том, что я забыл добавить исполняемый бит в файл.

Когда это случилось со мной, это произошло потому, что в моем сценарии были окончания строки DOS, которые всегда портили строку shebang вверху сценария. Я изменил это на окончания строки Unix, и это сработало.

Если это копия / вставка из вашего скрипта, вы переставили эту строку:

#!/usr/env/bin bash

Нет никаких #!/usr/env/bin, Вы имели в виду #!/usr/bin/env,

попробуйте запустить:

      systemctl daemon-reload

а потом снова запустить

      service <yourservice> status

Я столкнулся с аналогичной проблемой, изменил разрешение и добавил разрешение на выполнение

использовать chmod +x /etc/systemd/system/<service-filename>

Это сработало для меня

Я фактически использовал ответ из Как запустить приложение node.js в качестве фоновой службы? в сочетании с тем, что dwrz сказал выше. В моем случае я создавал бота Discord, который должен был работать, когда меня не было рядом.

С этим сервисом я изначально получил ту же ошибку, что и первоначальный постер, что привело меня сюда. Я упустил две вещи: узел #!/ Usr/bin/env в верхней части моего исполняемого скрипта node.js и приведенный выше список /bin/bash, который позволяет системе правильно выполнить его.

С тех пор проблем нет, хотя я намерен посмотреть, что еще можно распространить на сам сервис.

Другие вопросы по тегам