我正在尝试设置一个简单的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
作为我的外壳(从.bashrc开始)。
我很乐意发布完整的脚本,如果这是有帮助的。
发布于 2017-08-20 10:51:28
我想我找到了答案:
在.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
,但后来我看到了this SO answer which had it,觉得值得一试。
服务文件执行脚本,并且计时器列在systemctl --user list-timers
中,因此希望这能起作用。
更新:我可以确认现在一切正常。
发布于 2019-02-10 07:06:48
为简单起见,请确保在ExecStart脚本的顶部添加一个散列,即
#!/bin/bash
python -u alwayson.py
发布于 2018-02-09 03:01:05
当这种情况发生在我身上时,是因为我的脚本有DOS行结尾,这总是弄乱脚本顶部的shebang行。我将其更改为Unix行结尾,它起作用了。
https://stackoverflow.com/questions/45776003
复制相似问题