Linux 获取结果状态代码的简便方法;系统运行<;指挥部>&引用;?

Linux 获取结果状态代码的简便方法;系统运行<;指挥部>&引用;?,linux,virtualization,systemd,Linux,Virtualization,Systemd,似乎systemd run的结果状态代码总是0,除非调用运行时systemd单元失败 示例1: $ sudo systemd-run /usr/bin/true Running as unit run-12255.service. $ echo $? 0 $ sudo systemd-run /usr/bin/false Running as unit run-12258.service. $ echo $? 0 $ systemctl status $(sudo systemd-run /

似乎
systemd run
的结果状态代码总是
0
,除非调用运行时systemd单元失败

示例1:

$ sudo systemd-run /usr/bin/true
Running as unit run-12255.service.
$ echo $?
0

$ sudo systemd-run /usr/bin/false
Running as unit run-12258.service.
$ echo $?
0
$ systemctl status $(sudo systemd-run /usr/bin/true 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//')
● run-13004.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
$ echo $?
3

$ systemctl status $(sudo systemd-run /usr/bin/false 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//')
● run-13021.service - /usr/bin/false
   Loaded: loaded (/run/systemd/system/run-13021.service; static; vendor preset: disabled)
  Drop-In: /run/systemd/system/run-13021.service.d
           └─50-Description.conf, 50-ExecStart.conf
   Active: failed (Result: exit-code) since Sat 2015-08-08 07:31:10 UTC; 15ms ago
  Process: 13024 ExecStart=/usr/bin/false (code=exited, status=1/FAILURE)
 Main PID: 13024 (code=exited, status=1/FAILURE)
$ echo $?
3
$ systemctl status $(sudo systemd-run /usr/bin/true 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//') | (egrep -m 1 -o 'code=exited, status=[0-9]+'| egrep -o '[0-9]+') || echo '0'
0

$ systemctl status $(sudo systemd-run /usr/bin/false 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//') | (egrep -m 1 -o 'code=exited, status=[0-9]+'| egrep -o '[0-9]+') || echo '0'
1
我可以知道命令是否成功执行,如下所示

示例2:

$ sudo systemd-run /usr/bin/true
Running as unit run-12255.service.
$ echo $?
0

$ sudo systemd-run /usr/bin/false
Running as unit run-12258.service.
$ echo $?
0
$ systemctl status $(sudo systemd-run /usr/bin/true 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//')
● run-13004.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
$ echo $?
3

$ systemctl status $(sudo systemd-run /usr/bin/false 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//')
● run-13021.service - /usr/bin/false
   Loaded: loaded (/run/systemd/system/run-13021.service; static; vendor preset: disabled)
  Drop-In: /run/systemd/system/run-13021.service.d
           └─50-Description.conf, 50-ExecStart.conf
   Active: failed (Result: exit-code) since Sat 2015-08-08 07:31:10 UTC; 15ms ago
  Process: 13024 ExecStart=/usr/bin/false (code=exited, status=1/FAILURE)
 Main PID: 13024 (code=exited, status=1/FAILURE)
$ echo $?
3
$ systemctl status $(sudo systemd-run /usr/bin/true 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//') | (egrep -m 1 -o 'code=exited, status=[0-9]+'| egrep -o '[0-9]+') || echo '0'
0

$ systemctl status $(sudo systemd-run /usr/bin/false 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//') | (egrep -m 1 -o 'code=exited, status=[0-9]+'| egrep -o '[0-9]+') || echo '0'
1
但是返回的代码总是
3
,因为它是
systemctl status
命令的结果。 最后,我必须做以下几点

示例3:

$ sudo systemd-run /usr/bin/true
Running as unit run-12255.service.
$ echo $?
0

$ sudo systemd-run /usr/bin/false
Running as unit run-12258.service.
$ echo $?
0
$ systemctl status $(sudo systemd-run /usr/bin/true 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//')
● run-13004.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
$ echo $?
3

$ systemctl status $(sudo systemd-run /usr/bin/false 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//')
● run-13021.service - /usr/bin/false
   Loaded: loaded (/run/systemd/system/run-13021.service; static; vendor preset: disabled)
  Drop-In: /run/systemd/system/run-13021.service.d
           └─50-Description.conf, 50-ExecStart.conf
   Active: failed (Result: exit-code) since Sat 2015-08-08 07:31:10 UTC; 15ms ago
  Process: 13024 ExecStart=/usr/bin/false (code=exited, status=1/FAILURE)
 Main PID: 13024 (code=exited, status=1/FAILURE)
$ echo $?
3
$ systemctl status $(sudo systemd-run /usr/bin/true 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//') | (egrep -m 1 -o 'code=exited, status=[0-9]+'| egrep -o '[0-9]+') || echo '0'
0

$ systemctl status $(sudo systemd-run /usr/bin/false 2>&1 | awk '{ print $4 }' | sed -e 's/\.$//') | (egrep -m 1 -o 'code=exited, status=[0-9]+'| egrep -o '[0-9]+') || echo '0'
1
这太奇怪了

之所以使用
systemd run
并获取返回代码,是因为我想在运行的
systemd nspawn
ed容器环境中执行一个或多个命令(通过
systemd run--machine=my_container

总而言之,我想在
systemd nspawn
ed容器中执行一个命令,并获得结果代码,就像
docker exec
(没有
machinectl登录,因为我想通过非交互式脚本文件执行这么多命令)。

有人能告诉我获取它的简单方法吗?

我不知道基于
systemd
的虚拟化的细节,但是如果您需要以前命令的返回码来决定是否运行其他命令,或者决定要运行哪些命令,一个简单的解决方案可能是放置您的命令(not前缀为
sudo systemd run
)以及所有返回代码查询和相应的决策逻辑一起写入脚本

然后用sudosystemd run/path/to/that/script
调用该脚本

systemd运行的结果状态代码似乎始终为0 除非调用运行时systemd单元失败

是的,这是正确的和预期的行为..systemd run在这种特定情况下不单独运行命令。它使用您选择的参数创建、验证和排队一个瞬态.service文件,然后由“-system”或“-user”服务管理器启动。 为了得到你想要的

# systemd-run --scope /bin/true
# echo $?
0
# systemd-run --scope /bin/false
# echo $?
1
请注意,在这种情况下,作用域单元将继承调用脚本的环境,仅当命令完成时执行才会返回。

您需要使用
--resident after exit
通知Systemd保留服务单元,以便可以获取其状态

# systemd-run  --unit=kek$RANDOM --remain-after-exit     bash -c 'sleep 2; id; exit 216'
Running as unit kek30537.service.

# systemctl show  kek30537.service  -p ExecMainStatus
ExecMainStatus=216

谢谢!它在正常的
systemd run--scope
情况下运行良好,但在
systemd run--scope--machine=my_container
情况下不起作用。错误消息是
非本地系统不支持scope执行。
@takaomag不幸的是,您运气不好。.这个特定功能是故意不实现的校正..@CristianRodriguez任何想法为什么
systemd run--scope--slice=test sleep 5
最终出现在
system.slice
而不是
test.slice
?@AlexBrand没有验证来检查切片是否存在,也没有创建新的切片。我不确定它是否是一个文档错误(缺少“切片必须存在”)或者一个bug“systemd run也应该创建一个临时切片”@CristianRodriguez我用一个现有的和活动的切片测试了这个,但它仍然不工作。它对你有用吗?我创建了