【问题标题】:Systemd script fail系统脚本失败
【发布时间】:2017-10-12 20:33:21
【问题描述】:

我想在系统启动时在 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'.

可能出了什么问题?

【问题讨论】:

  • systemd 日志应该已经记录了它的所有输出。试试journalctl -u backup
  • 请记住,您不必重新启动即可尝试运行 systemd 作业。首先使用systemctl start backup
  • 除了几个 SPECIFIERS(在man systemd.unit 中找到那个部分),systemd 确实在单元文件中执行环境变量替换。
  • 我会做的其他事情:在脚本中明确设置 PATH,或者对所有命令使用绝对路径。
  • @ZanLynx,我读到 OP 表明他们只是将问题替换为匿名化工作(“替换了上面的密码、用户和路径”),而且它确实是一个合法的绝对路径在正版代码中。

标签: linux bash systemd


【解决方案1】:

解决了伙计们。有两个问题:

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
    

    到类似于:https://serverfault.com/questions/751030/systemd-ignores-return-code-while-starting-service 的 systemd 条目

    如果您的服务或脚本没有分叉,请在末尾添加 & 以在后台运行它,并以 0 快速退出。否则它将就像一个启动超时并且永远需要/看起来像冻结的服务。

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2020-10-21
      • 2018-04-06
      • 2015-02-21
      • 2013-04-16
      • 2011-09-10
      相关资源
      最近更新 更多