Systemd脚本执行失败

5
我希望在Debian 9系统启动时运行一个脚本。我的脚本在单独运行时有效,但在systemd下失败。
我的脚本只是将备份文件从远程服务器复制到本地机器:
#!/bin/sh
set -e

/usr/bin/sshpass -p "PASSWORD" /usr/bin/scp -p USER@10.0.0.2:ORIGINPATH/backupserver.zip DESTINATIONPATH/backupserver/

为保护隐私,上面的密码、用户名和路径已被替换。

我编写了以下systemd服务单元:

[Unit]
Description=backup script

[Service]
Type=oneshot
ExecStart=PATH/backup.sh

[Install]
WantedBy=default.target

然后我为脚本设置权限:

chmod 744 PATH/backup.sh

同时安装该服务:

chmod 664 /etc/systemd/system/backup.service
systemctl daemon-reload
systemctl enable backup.service

当我重启脚本时,它会失败:

 backup.service - backup script
   Loaded: loaded (/etc/systemd/system/backup.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2017-05-13 13:39:54 -03; 47min ago
 Main PID: 591 (code=exited, status=1/FAILURE)

journalctl -xe的结果如下:

mai 16 23:34:27 rodrigo-acer systemd[1]: backup.service: Main process exited, code=exited, status=6/NOTCONFIGURED
mai 16 23:34:27 rodrigo-acer systemd[1]: Failed to start backup script.
mai 16 23:34:27 rodrigo-acer systemd[1]: backup.service: Unit entered failed state.
mai 16 23:34:27 rodrigo-acer systemd[1]: backup.service: Failed with result 'exit-code'.

可能出了什么问题?


1
systemd日志应该已记录了所有输出。请尝试使用“journalctl -u backup”命令。 - Zan Lynx
1
记住,您无需重新启动即可尝试运行systemd作业。首先使用systemctl start backup使其正常工作。 - Zan Lynx
其他我会做的事情:在你的脚本中明确设置PATH,或者对所有命令使用绝对路径。 - Zan Lynx
@ZanLynx,我读到OP的意思是他们只是为了匿名化而将其替换为问题(“上面替换了密码、用户和路径”),而实际上这是真正代码中的合法绝对路径。 - Charles Duffy
啊,好的。我没听清你说的话——那绝对是有可能的。不过,我更倾向于让他们实际阅读期刊(也许自己学到一些东西),而不是在这个时候就猜测。 - Charles Duffy
显示剩余3条评论
2个回答

4

问题已解决。有两个问题:

1- 我需要更改服务单元文件,以便在网络启动后才运行服务。单元部分已更改为:

 [Unit]
 Description = World server backup
 Wants = network-online.target
 After = network.target network-online.target

2 - root用户没有将远程主机添加到已知主机列表中,这与我用来测试脚本的普通用户不同。


2

执行结果为“退出代码”,您可以尝试在最后一行添加以下内容:

# REQUIRED FOR SYSTEMD: 0 means clean no error
exit 0

您可能还需要添加以下内容:
Type=forking

针对类似于systemd的条目,如果您的服务或脚本不是fork模式,请在末尾添加&以在后台运行,并快速退出并返回0。否则,它将会像启动超时和需要很长时间/看起来像冻结服务一样。

参考链接:https://serverfault.com/questions/751030/systemd-ignores-return-code-while-starting-service


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接