Исправление сбоя службы 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, который позволяет системе правильно выполнить его.
С тех пор проблем нет, хотя я намерен посмотреть, что еще можно распространить на сам сервис.