从runuser命令

时间:2017-05-16 07:46:21

标签: linux bash user-permissions

我想以特定用户身份运行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" &

一切都运转良好。我想使用没有单独文件的第一个例子。谁能告诉我什么可能是错的?这个问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

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

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

$?替换为\$?

答案 1 :(得分: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 $?"