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

dwr*_*wrz 49 bash systemd

我正在尝试设置一个简单的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'.
Run Code Online (Sandbox Code Playgroud)

我迷路了,因为文件和目录存在.该脚本是可执行的,只是为了检查,我甚至设置了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
Run Code Online (Sandbox Code Playgroud)

这是backup.service:

[Unit]
Description=backup

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

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

最后,这是一个意思backup.sh:

#!/usr/env/bin bash

rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/
Run Code Online (Sandbox Code Playgroud)

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

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

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

dwr*_*wrz 104

我想我找到了答案:

.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)而这个特定的脚本没有. (6认同)

cri*_*aig 13

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

#!/bin/bash

python -u alwayson.py    
Run Code Online (Sandbox Code Playgroud)


Kar*_*kus 9

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


ke4*_*ukz 8

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

  • 你救了我的命!我刚刚在`.sh`的第一行添加了`#!/ usr/bin/env bash`然后工作了. (2认同)

小智 7

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

#!/usr/env/bin bash
Run Code Online (Sandbox Code Playgroud)

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