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