【发布时间】:2015-08-08 07:55:37
【问题描述】:
看来systemd-run <command> 的结果状态码总是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
我可以知道命令是否成功执行如下。
示例 2:
$ 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
但是返回的代码总是3,因为它是systemctl status 命令的结果。
最后,我必须做到以下几点;
示例 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-nspawned 容器环境中执行一个或多个命令(by systemd-run --machine=my_container)。
总而言之,我想在systemd-nspawned 容器中执行一个命令,并像docker exec 一样获得结果代码(没有machinectl login,因为我想通过非交互式脚本文件执行这么多命令)。
谁能告诉我获取它的简单方法?
【问题讨论】:
标签: linux virtualization systemd