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

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

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'.

Я потерян, так как файлы и каталоги существуют. script является исполняемым и, просто для проверки, я даже установил разрешения для 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/

script отлично работает, если я сам его выполнил.

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

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

Ответ 1

Думаю, я нашел ответ:

В файле .service мне нужно добавить /bin/bash до пути к script.

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

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

В отличие от:

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

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

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

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

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

Ответ 2

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

Ответ 3

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

#!/bin/bash

python -u alwayson.py    

Ответ 4

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

#!/usr/env/bin bash

Там нет #!/usr/env/bin, вы имели в виду #!/usr/bin/env.

Ответ 5

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

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

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

Ответ 6

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