从 runuser 命令传播退出代码

Posted

技术标签:

【中文标题】从 runuser 命令传播退出代码【英文标题】:Propagate exit code from runuser command 【发布时间】:2017-05-16 07:46:21 【问题描述】:

我想以特定用户身份运行 bash 脚本 StartSomething.sh。我为此使用 runuser 命令。我也想知道这个 bash 脚本的退出代码。因此,当命令完成或中断时,我将退出代码写入文件。代码如下:

runuser myuser -s /bin/bash -c "./StartSomething.sh --pidfile=$pidfile; \
                                echo $? > $statusfile;" &
sleep 5
pid=$(cat $pidfile)

while ps -p $pid > /dev/null; do sleep 1; done
end=$(cat $statusfile)
echo "End code: $end"
exit $end

问题是退出代码仍然为 0,尽管 bash 脚本被中断。有什么问题?

如果我有单独的文件 start.sh,使用以下代码:

./StartSomething.sh --pidfile=$pidfile echo $? > $statusfile

和 runuser 命令看起来像这样:

runuser myuser -s /bin/bash -c "./start.sh" &

一切正常。我想使用没有单独文件的第一个示例。有人能告诉我有什么问题吗?这个问题有更好的解决方案吗?

【问题讨论】:

如何中断脚本? 我使用 kill -11 $(pgrep StartSomething.sh) 我认为没有更多信息是无法解决的。假设您在某处设置了变量pidfilestatusfile,它们的内容是什么? echo "End code: $end" 带给你什么? Pidfilestatusfile 设置在此代码之前。我认为这并不重要。 echo "End code: $end" 给出 0。 【参考方案1】:

如果你只想在后台运行程序,并等待它完成,我想你也可以使用wait 来获取返回值(runuser 传递它,除非有什么异常发生):

runuser myuser ./StartSomething.sh --pidfile=$pidfile &
pid=$!
# do something else
wait $!
echo "it returned $?"

runuser myuser ./StartSomething.sh --pidfile=$pidfile &
pid=$!
echo -n "waiting"
while kill -0 $pid 2>/dev/null; do
    echo -n "." 
    sleep 1
done
echo
wait $!
echo "it returned $?"

【讨论】:

【参考方案2】:

转义特殊字符 $ 存在问题。正确的命令:

runuser myuser -s /bin/bash -c "./StartSomething.sh --pidfile=$pidfile; \
                                echo \$? > $statusfile;" &

$? 替换为\$?

【讨论】:

以上是关于从 runuser 命令传播退出代码的主要内容,如果未能解决你的问题,请参考以下文章

runuser 命令详解

从 DB2 存储过程出口处理程序传播默认 SQL 异常

DependencyProperty 的值不会从 XAML 传播到后面的代码

卷积神经网络:反向传播过程的代码实现

反向传播算法的算法简介

如何停止将事件从父 div 传播到子 div