【发布时间】:2018-01-28 06:47:03
【问题描述】:
我正在尝试设置一个简单的 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.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 作为我的 shell(从 .bashrc 开始)。
如果有帮助,我很乐意发布完整的脚本。
【问题讨论】:
-
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/。 -
旁白:从
.bashrc开始钓鱼是一个真的坏主意。更新您的/etc/passwd条目以直接指定 fish,不要混淆可能有意运行交互式 bash 实例的程序,使其启动不同的、不兼容的 shell。 -
至于眼前的问题,我先用Sysdig跟踪执行来重现它;这样您就可以找到失败的确切系统调用并提取相关详细信息(活动 PATH、uid、gid 等)。
-
顺便说一句,是否在调用您的服务时设置了
PATH?如果env bash找不到bash因为没有PATH,那会导致你的错误。在.service中设置Environment=PATH=/bin:/usr/bin或其他已知良好的值不会有任何影响。