Bash 如何更换';超时';? if[“$EUID”-ne 0] 然后 回声“ echo“请以root用户身份运行脚本” 回声“ 出口 fi 用于在{1..11}中运行 做 回声“ echo$run'th running…' 回显“正在启动tst脚本…” 回声“ timeout 30 sudo./tst.sh

Bash 如何更换';超时';? if[“$EUID”-ne 0] 然后 回声“ echo“请以root用户身份运行脚本” 回声“ 出口 fi 用于在{1..11}中运行 做 回声“ echo$run'th running…' 回显“正在启动tst脚本…” 回声“ timeout 30 sudo./tst.sh,bash,shell,Bash,Shell,我很困惑timeout 30是一个好的解决方案。如果我把脚本精简到最低限度 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...'

我很困惑
timeout 30
是一个好的解决方案。如果我把脚本精简到最低限度

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
并使用
time bash test运行它。sh
I get:

echo hop
timeout 2 sudo sleep 20
echo plop
换句话说,
timeout
之后的行将被执行(与您所经历的相反),但是
sleep 20
不会在2秒后终止

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

hop
plop

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

我找到了一个更适合我的解决方案,使用sudo的非交互标志

sudo ./tst.sh &
pid=$!
sleep 30
kill $pid
基本上,它不会要求您输入密码,但如果您还没有sudo,它会失败

sudo-n-v2>/dev/null
如果[[“${?}”!=“0”];然后
回声“
echo“请以root用户身份运行脚本”
回声“
fi
如果您不将
stderr
重定向到
/dev/null
,您将得到
sudo:需要密码的消息


-v
用于验证和更新您当前的sudo“会话”。我之所以使用它,是因为它不输出任何内容。

您是否希望将
tst.sh
作为后台进程运行?顺便说一句:将您的doube引号替换为单个引号。在该网站上搜索
bash timeout
。实际上,它作为后台运行与否并不重要。对我来说,重要的是,我运行它,然后停止,然后执行下一行,等等11次你的帖子不包括它,但是有一个
#/bin/bash-e
set-e
set-euo-pipefail
脚本中的任何位置?这就可以解释问题了。谢谢你的回答。好的,但是现在我有以下问题。我只想在所有行都已执行的情况下杀死tst.sh。所以,在echo的“重新启动脚本…”一行之后。对不起,我给了你关于进程终止的错误信息。我希望你理解我,我需要什么。基本上,你可以将
kill$pid
放在脚本中的任何地方。只要确保
pid=$!
是在
sudo./tst.sh
启动之后。
     -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.