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.timer和backup.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开始)。
如果有帮助,我很乐意发布完整的脚本。
-
ls -l homeuser.scriptsbackup.sh输出什么? backup.sh脚本的开头看起来很奇怪:#!userenvbin bash,可执行文件userenvbin是否真的存在?你确定你不是指usrbinenv或homeuserbinenv吗?
-
ls输出-rwxrwxrwx 1 dwrz dwrz 1470 Aug 11 01:57 homeuser.scriptsbackup.sh。而我的道歉 - 当我把东西复制到这里时,shebang中的拼写错误。脚本中的usr。
-
旁白:从.bashrc开始鱼是一个非常糟糕的主意。更新您的etcpasswd条目以直接指定fish,不要混淆可能故意想要运行交互式bash实例的程序,方法是让它启动一个不同的,不兼容的shell。
-
至于眼前的问题,Id首先通过Sysdig跟踪执行来重现它;这样你就可以找到失败的确切系统调用并提取相关细节(活动路径,uid,gid等)。
-
顺便说一句,调用服务时是否设置了PATH?如果env bash找不到bash,因为没有PATH,那将导致您的错误。设置Environment=PATH=bin:usrbin或.service中的已知良好值不会造成伤害。
-
非常感谢,查尔斯。我没有在etcpasswd中设置fish,因为Arch Wiki建议反对它,但我很欣赏这些提示并且也会对此进行调查。现在我尝试了两件事:(1)在服务文件中指定PATH,(2)在脚本中使用#!binbash(当我自己执行时仍然运行正常)。我仍然得到与systemd相同的错误(确保daemon-reload)。我现在要看sysdig。
我想我找到了答案:
在.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中,所以希望这可以工作。
更新:我可以确认现在一切正常。
-
这解决了我。它与其他脚本一起使用的原因是它们在开头有一个shebang(#!/ bin / bash)而这个特定的脚本没有。
-
这个工作非常烦人,写一个#!行告诉内核要使用什么解释器,现在我必须在单元文件中镜像这些信息,以用于不是单例的应用程序-_- what
-
即使可执行文件不是bash脚本,例如在我的情况下,在CentOS 7上jupyter,binbash -c"..."也是必要的。我认为这是因为它是一个python脚本,它在一开始就有一个pybang的pybang。
-
脚本应该有一个解释器,否则它们不是脚本。您应该修复脚本,而不是将bash添加到.service文件中。
-
有时您需要chmod +x homeuser.scriptsbackup.sh。
-
在我的情况下,我失踪了.sh扩展名
-
我有#!binbash但仍然无法正常工作。我不知道为什么,但.service文件中的binbash前缀仍然是必要的
当我遇到这种情况时,这是因为我的脚本有DOS行结尾,它总是弄乱脚本顶部的shebang行。我将其更改为Unix行结尾并且有效。
-
你救了我的命!我刚刚在.sh的第一行添加#!usrbinenv bash然后工作了。
为简化起见,请确保在ExecStart脚本的顶部添加哈希爆炸,即
1 2 3
| #!/bin/bash
python -u alwayson.py |
如果这是您脚本中的复制/粘贴,则您已置换此行:
没有#!/usr/env/bin,你的意思是#!/usr/bin/env。
-
好抓!这个脚本现在是正确的,但我可能会在之后修复它。如果它是复制粘贴,这将解释它。
我实际上使用了如何运行node.js应用程序作为后台服务的答案?结合dwrz上面说的话。在我的情况下,我正在创建一个Discord机器人,当我不在身边时需要能够运行。
有了这个服务,我最初得到了与最初的海报相同的错误,这使我来到这里。我错过了我执行的node.js脚本顶部的#!/usr/bin/env node。
从那以后,没有问题,虽然我打算看看还有什么可以扩展到服务本身。
我今天遇到了Main process exited, code=exited, status=203/EXEC,我的错误是我忘了将可执行位添加到文件中。