简短版本是:
我有一个systemd单元,我想在调用时检查脚本的返回码:
systemctl status service.service
长版本:我有一个lsb初始化脚本就是这样做的,当状态作为参数传递时,它调用了一个脚本来检查几个进程的状态,并根据返回代码,init系统正确返回了软件的状态。
现在,在将脚本调整为systemd时,我无法了解如何配置此行为。
答案 0 :(得分:4)
这在systemd中是不可能的。 systemctl status
动词始终执行相同的操作,不能将每个单元重写为自定义操作。
您可以编写一个foo-status.service
单元文件,其中Type=oneshot
和ExecStart=
指向您的自定义状态脚本,然后运行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'
这将返回服务的退出代码。