修复systemd服务203 / EXEC故障(无此类文件或目录)


74

我正在尝试设置一个简单的systemd计时器来每天午夜运行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.timerbackup.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开始)。

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


4
什么ls -l /home/user/.scripts/backup.sh输出?backup.sh脚本的开头看起来很奇怪:#!/user/env/bin bash可执行文件/user/env/bin实际上存在吗?你确定你不是故意的/usr/bin/env还是/home/user/bin/env

ls输出-rwxrwxrwx 1 dwrz dwrz 1470 Aug 11 01:57 /home/user/.scripts/backup.sh。我的道歉-在shebang中的错字是当我将内容复制到此处时。这是/usr/在脚本。
dwrz

除了:从头开始钓鱼.bashrc是一个非常糟糕的主意。更新您的/etc/passwd条目以直接指定fish,不要通过使它启动不同的不兼容shell来使可能故意要运行交互式bash实例的程序感到困惑。
查尔斯·达菲

至于眼前的问题,我将首先使用Sysdig跟踪执行来重现它。这样,您可以找到失败的确切系统调用并提取相关详细信息(活动的PATH,uid,gid等)。
查尔斯·达菲

顺便说一句,有一个PATH当你调用服务集?如果因为没有env bash而找不到,那将导致您的错误。设置或以其他方式获得已知的良好值不会有任何损害。bashPATHEnvironment=PATH=/bin:/usr/bin.service
查尔斯·达菲

Answers:


150

我想我找到了答案:

.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,因此希望可以使用。

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


9
这为我解决了。它与其他脚本一起使用的原因是,它们的开头有一个shebang(#!/ bin / bash),而这个脚本却没有。
FelixMüller18年

这种解决方法非常烦人,写#!一行代码告诉内核使用什么解释器,现在对于非单例应用程序,我必须将此信息镜像到单元文件中-_-什么
-ThorSummoner

1
即使可执行文件不是bash脚本(例如我jupyter在CentOS 7上),/bin/bash -c "..."也是必需的。我认为这是因为它是python脚本,并且一开始就具有python shebang的功能。
WesternGun

1
脚本应该具有解释器,否则它们不是脚本。您应该修复脚本,而不是在.service文件中添加bash 。
mikemaccana

1
有时您需要一个chmod +x /home/user/.scripts/backup.sh
ST-DDT

9

发生这种情况是因为我的脚本的DOS行结尾,这总是弄乱了脚本顶部的shebang行。我将其更改为Unix行尾并且可以正常工作。


3
你救了我的命!我只是#!/usr/bin/env bash在工作的第一行添加了内容.sh
kujiy

9

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

#!/bin/bash

python -u alwayson.py    

7

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


1
我来到这里阅读标记的答案,然后在阅读您的答案之前发现,只需执行chmod 700 <script>就可以解决我的问题。应该将其标记为正确答案。我不必添加/ bin / bash <脚本启动>作为标记的答案状态。
nikolaosinlight

6

如果这是脚本的复制/粘贴,那么您已对以下行进行了置换:

#!/usr/env/bin bash

没有#!/usr/env/bin,你是说#!/usr/bin/env


1
好赶上!该脚本现在是正确的,但是以后我可能会修复它。如果它是复制粘贴,那就可以解释了。
dwrz

0

我实际上使用了如何将node.js应用程序作为后台服务运行的答案结合以上dwrz所说的。以我为例,我正在创建一个Discord机器人,该机器人必须能够在我不在的时候才能运行。

有了这项服务,我最初遇到的错误与最初发布者所犯的错误相同,这使我到了这里。我#!/usr/bin/env node在执行的node.js脚本的顶部缺少。

从那以后,没有问题,尽管我打算看看可以对服务本身进行扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.