我尝试设置一个简单的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开始)。
如果有帮助,我很乐意发布完整的剧本。
答案 0 :(得分:77)
我想我找到了答案:
在.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
中,所以希望这可行。
更新:我可以确认现在一切正常。
答案 1 :(得分:6)
当我遇到这种情况时,这是因为我的脚本有DOS行结尾,它总是弄乱脚本顶部的shebang行。我将其更改为Unix行结尾并且有效。
答案 2 :(得分:2)
为简化起见,请确保在ExecStart脚本的顶部(即
ftruncate
答案 3 :(得分:2)
如果这是脚本的复制/粘贴,则您已对以下行进行了置换:
#!/usr/env/bin bash
没有#!/usr/env/bin
,您的意思是#!/usr/bin/env
。
答案 4 :(得分:1)
我实际上将How do I run a node.js app as a background service?中的答案与dwrz所说的结合使用。就我而言,我正在创建一个Discord机器人,该机器人必须能够在不在时运行。
有了这项服务,最初我遇到了与最初发布者相同的错误,这使我到了这里。我在执行的node.js脚本顶部缺少#!/usr/bin/env node
。
从那时起,没有问题,尽管我打算看看还可以扩展到服务本身。
答案 5 :(得分:0)
我今天也遇到了((A, slope), B)
,我的错误是我忘记了将可执行位添加到文件中。
答案 6 :(得分:0)
尝试运行:
systemctl daemon-reload
然后再次运行
service <yourservice> status