Исправление ошибки systemd service 203 / EXEC (нет такого файла или каталога)

я пытаюсь настроить простой таймер systemd для запуска 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 с).

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

2 ответов


кажется, я нашел ответ:

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

например, для резервного копирования.обслуживание:

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

против:

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

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

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

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

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


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