如何更换'超时'?

时间:2017-04-25 20:00:27

标签: bash shell

if [ "$EUID" -ne 0 ]
  then
    echo '' 
    echo 'Please run the script as root'
    echo ''
  exit
fi

for run in {1..11}
do  
    echo ''
    echo $run'th running...'    

    echo 'Starting tst script...'
    echo ''
    timeout 30 sudo ./tst.sh  <-----XXXXXX

    # Call next script
    echo ''
    echo 'Sending data...'

    for run in {1..10}
    do  # run 10 times
        sudo /home/ubuntu/Desktop/data/data <----- data.sh          
    done

    echo ''
    echo 'restarting script..."

done

问题是我想要启动tst.sh而且30秒后我想要停止它。虽然'timeout 30'是一个很好的解决方案,但下一行不会被执行。我如何解决这个问题,以便我可以在执行tst.sh后停止并执行以下行?

感谢。

2 个答案:

答案 0 :(得分:0)

令我困惑的是timeout 30是一个很好的解决方案。如果我将脚本删除到最低限度,

echo hop
timeout 2 sudo sleep 20
echo plop

并使用time bash test.sh运行它:

hop
plop

real    0m20.039s
user    0m0.012s
sys     0m0.025s

换句话说,timeout执行后的行(与您遇到的相反),但{2}后sleep 20没有被杀死。

无论如何,另一个解决方案可能是:

sudo ./tst.sh &
pid=$!
sleep 30
kill $pid

答案 1 :(得分:0)

我发现了使用sudo的 non-interactive 标志对我来说更有效的解决方案。

     -n, --non-interactive
                 Avoid prompting the user for input of any kind.  If a password is required
                 for the command to run, sudo will display an error message and exit.

基本上,它不会询问您密码,但是如果您还没有sudo,则会失败。

sudo -n -v 2> /dev/null
if [[ "${?}" != "0" ]]; then

    echo '' 
    echo 'Please run the script as root'
    echo ''
fi

如果不将stderr重定向到/dev/null,则会显示sudo: a password is required消息。

-v用于验证和更新您当前的sudo“会话”。我用它是因为它什么都不输出。