Systemd 脚本失败

Rod*_*igo 5 linux bash systemd

我想在 Debian 9 机器中的系统启动时运行脚本。我的脚本在独立运行时可以工作,但在 systemd 下会失败。

\n\n

我的脚本只是将备份文件从远程服务器复制到本地计算机:

\n\n
#!/bin/sh\nset -e\n\n/usr/bin/sshpass -p "PASSWORD" /usr/bin/scp -p USER@10.0.0.2:ORIGINPATH/backupserver.zip DESTINATIONPATH/backupserver/\n
Run Code Online (Sandbox Code Playgroud)\n\n

出于隐私考虑,我替换了上面的密码、用户和路径。

\n\n

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

\n\n
[Unit]\nDescription=backup script\n\n[Service]\nType=oneshot\nExecStart=PATH/backup.sh\n\n[Install]\nWantedBy=default.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我设置脚本的权限:

\n\n
chmod 744 PATH/backup.sh\n
Run Code Online (Sandbox Code Playgroud)\n\n

并安装了服务:

\n\n
chmod 664 /etc/systemd/system/backup.service\nsystemctl daemon-reload\nsystemctl enable backup.service\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我重新启动时,脚本失败:

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

Journalctl -xe 的结果:

\n\n
mai 16 23:34:27 rodrigo-acer systemd[1]: backup.service: Main process exited, code=exited, status=6/NOTCONFIGURED\nmai 16 23:34:27 rodrigo-acer systemd[1]: Failed to start backup script.\nmai 16 23:34:27 rodrigo-acer systemd[1]: backup.service: Unit entered failed state.\nmai 16 23:34:27 rodrigo-acer systemd[1]: backup.service: Failed with result \'exit-code\'.\n
Run Code Online (Sandbox Code Playgroud)\n\n

可能出什么问题了?

\n

Rod*_*igo 4

解决了各位。有两个问题:

1 - 我必须更改服务单元文件以使服务仅在网络启动后运行。单元部分更改为:

 [Unit]
 Description = World server backup
 Wants = network-online.target
 After = network.target network-online.target
Run Code Online (Sandbox Code Playgroud)

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