系统单元,使用外部脚本检查状态

时间:2016-08-23 06:16:51

标签: systemd lsb

简短版本是:

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

systemctl status service.service

长版本:我有一个lsb初始化脚本就是这样做的,当状态作为参数传递时,它调用了一个脚本来检查几个进程的状态,并根据返回代码,init系统正确返回了软件的状态。

现在,在将脚本调整为systemd时,我无法了解如何配置此行为。

3 个答案:

答案 0 :(得分:4)

简短回答

这在systemd中是不可能的。 systemctl status动词始终执行相同的操作,不能将每个单元重写为自定义操作。

长答案

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

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

答案 1 :(得分:0)

如果您可以控制服务代码,那么您可以轻松地编辑它并将结果保存到文件中。

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

 #include <stdio.h>

unsigned srl (unsigned x, int k)
{
    /* perform shift arithmetically */
    printf("x = %u, (int) x= %d\n", x, (int) x);
    unsigned xsra = (int) x >> k;
    printf("\nxsra before was: %u\n", xsra);
    unsigned test = 0xffffffff;
    test <<= ((sizeof (int) << 3) - k); // get e.g., 0xfff00...
    printf("test after shift is: %x, xsra & test = %x\n", test, xsra & test);
    if (xsra & test == 0) // if xsrl is positve
        return xsra;
    else
        xsra ^= test;    // turn 1s into 0s

    return xsra;
}

int sra (int x, int k) 
{
    /* perform shift logically */
    int xsrl = (unsigned) x >> k;
    unsigned test = 0xffffffff;
    test << ((sizeof (int) << 3) - k + 1); // get e.g., 0xffff00...
    if (xsrl & test == 0) // if xsrl is positve
        return xsrl;
    else 
                            xsrl |= test;

        return xsrl;
}

int main(void)
{
    int a;
    unsigned b;
    unsigned short n;

    puts("Enter an integer and a positive integer (q or negative second number to quit): ");
    while(scanf("%d%u", &a, &b) == 2 && b > 0)
    {
        printf("Enter the number of shifts (between 0 and %d): ", (sizeof (int) << 3) - 1);
        scanf("%d", &n);
        if (n < 0 || n >= ((sizeof (int)) << 3))
        {
            printf("The number of shifts should be between 0 and %d.\n", ((sizeof (int)) << 3) - 1);
            break;
        }
        printf("\nBefore shifting, int a = %d, unsigned b = %u\n", a, b);
        a = sra(a, n);
        b = srl(b, n);
        printf("\nAfter shifting, int a = %d, unsigned b = %u\n", a, b);
        puts("\nEnter an integer and a positive integer (q or negative second number to quit): ");
    }
    puts("Done!");

    return 0;
}

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

#!/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 只能由root写入,如果你不是root,请使用/run/。)

答案 2 :(得分:0)

您可以使用:

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

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