从 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) 我认为没有更多信息是无法解决的。假设您在某处设置了变量pidfile
和statusfile
,它们的内容是什么? echo "End code: $end"
带给你什么?
Pidfile
和 statusfile
设置在此代码之前。我认为这并不重要。 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 命令传播退出代码的主要内容,如果未能解决你的问题,请参考以下文章