【问题标题】:Systemd unit, check status with external scriptSystemd 单元,使用外部脚本检查状态
【发布时间】:2016-12-29 20:07:18
【问题描述】:

简短的版本是:

我有一个 systemd 单元,我想在调用时检查脚本的返回码:

systemctl status service.service

长版:我有一个 lsb init 脚本可以做到这一点,当状态作为参数传递时,它调用一个脚本来检查多个进程的状态,并根据返回代码,init 系统正确返回软件的状态.

现在在将脚本调整为 systemd 时,我不知道如何配置此行为。

【问题讨论】:

    标签: systemd lsb


    【解决方案1】:

    简答

    这在 systemd 中是不可能的。 systemctl status 动词总是做同样的事情,它不能按单元覆盖到自定义操作。

    长答案

    您可以编写一个foo-status.service 单元文件,其中Type=oneshotExecStart= 指向您的自定义状态脚本,然后运行systemctl start foo-status。但是,这只会提供零/非零信息(任何非零退出代码都将转换为 1)。

    要获取您的状态脚本的真正退出代码,请运行systemctl show -pExecMainStatus foo-status,但是,如果您走到这一步,那么直接运行您的脚本会更简单。

    【讨论】:

      【解决方案2】:

      你可以使用:

      systemctl show -p  ExecMainStatus service.service | sed 's/ExecMainStatus=//g'
      

      这将返回服务的退出代码。

      【讨论】:

        【解决方案3】:

        如果您可以控制以这种方式启动/停止的服务的代码,那么您可以轻松地对其进行编辑并将结果保存在文件中。

        否则,您始终可以添加一个为您执行此操作的包装器。

        #!/bin/sh
        /path/to/service and args here
        echo $? >/run/service.result
        

        然后可以使用该文件的内容访问您的状态:

        STATUS=`cat /run/service.result`
        if test $STATUS = 1
        then
          echo "An error occurred..."
        fi
        

        (旁注:/run/ 只能由 root 写入,如果您不是 root,请使用 /tmp/。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 2020-11-23
          • 1970-01-01
          • 2013-12-14
          • 1970-01-01
          • 2013-01-05
          相关资源
          最近更新 更多