关于bash:修复systemd服务203 / EXEC失败(没有这样的文件或目录)

Fixing a systemd service 203/EXEC failure (no such file or directory)

我正在尝试设置一个简单的systemd计时器,以便每天午夜运行bash脚本。

systemctl --user status backup.service失败并记录以下内容:

1
2
3
4
5
6
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.timerbackup.service单元文件位于/home/user/.config/systemd/user中。

backup.timer已加载并处于活动状态,目前正在等待午夜。

这是它的样子:

1
2
3
4
5
6
7
8
9
[Unit]
Description=Runs backup at 0000

[Timer]
OnCalendar=daily
Unit=backup.service

[Install]
WantedBy=multi-user.target

这是backup.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=backup

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

[Install]
WantedBy=multi-user.target

最后,这是backup.sh的解释:

1
2
3
#!/usr/env/bin bash

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

如果我自己执行它,脚本运行正常。

不确定它是否重要,但我使用fish作为我的shell(从.bashrc开始)。

如果有帮助,我很乐意发布完整的脚本。


我想我找到了答案:

.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中,所以希望这可以工作。

更新:我可以确认现在一切正常。


当我遇到这种情况时,这是因为我的脚本有DOS行结尾,它总是弄乱脚本顶部的shebang行。我将其更改为Unix行结尾并且有效。


为简化起见,请确保在ExecStart脚本的顶部添加哈希爆炸,即

1
2
3
#!/bin/bash

python -u alwayson.py

如果这是您脚本中的复制/粘贴,则您已置换此行:

1
#!/usr/env/bin bash

没有#!/usr/env/bin,你的意思是#!/usr/bin/env


我实际上使用了如何运行node.js应用程序作为后台服务的答案?结合dwrz上面说的话。在我的情况下,我正在创建一个Discord机器人,当我不在身边时需要能够运行。

有了这个服务,我最初得到了与最初的海报相同的错误,这使我来到这里。我错过了我执行的node.js脚本顶部的#!/usr/bin/env node

从那以后,没有问题,虽然我打算看看还有什么可以扩展到服务本身。


我今天遇到了Main process exited, code=exited, status=203/EXEC,我的错误是我忘了将可执行位添加到文件中。