等待过程结束,或者用户输入继续

时间:2019-07-11 21:54:54

标签: bash macos kill

我有一个bash脚本,可在后台运行命令。执行后,将向用户显示:Press any key to continue(由read -n1 -r -p 'Press any key to continue' value提供支持)

我想让一些东西在后台监视命令以查看它何时完成,如果是,我仍然希望脚本继续执行。另一方面,该过程可能仍在进行,我想使用户能够按一个键来kill,而不是等待该过程完成。


我想最简单的可视化方法如下:

mac shut down

用户可以等待计时器变为0,计时器将自动关闭,或者如果单击关闭按钮,计时器将立即关闭。

3 个答案:

答案 0 :(得分:3)

如果您要等到用户按下按键之前的pid,可以执行以下操作:

./long_command.sh &
waitpid=$!
echo "Hit any key to continue or wait until the command finishes"
while kill -0 ${waitpid} > /dev/null ; do
    #if [[ ${#KEY} -gt 0 ]] ; then
    if read -n 1 -t 1 KEY ; then
        kill ${waitpid}
        break
    fi
done

只需用命令替换long_command.sh。这里$!返回上一个启动的子进程的pid,kill -0 ${waitpid}检查该进程是否仍然存在(不会终止该进程)。 ps -q ${waitpid}也可以在Linux上使用,但不能在Mac上使用-谢谢@leetbacoon提到这一点。 read -n 1 -t 1的意思是“读一个字符,但最多等待1秒”(您也可以在此处使用小数,例如0.5)。该命令的返回状态取决于是否可以在指定的时间内读取字符。

答案 1 :(得分:2)

类似的事情可能对您有用

#!/bin/bash

doStuff() {
    local pidOfParent="$1"

    for i in $(seq 10); do
        echo "stuff ${i}" > /dev/null
        sleep 1
    done

    kill $pidOfParent
}

doStuff $$ &

doStuffPid="$!"

read -n1 -rp 'Press any key to continue' && kill $doStuffPid

崩溃

doStuff是我们的功能,其中包含您要在后台运行的内容,即音乐。

$$是正在运行的脚本的PID,我们将其传递到函数中以使其更具描述性,pidOfParent在完成工作后便在其中kill

调用函数后的&将其放在后台。

$!获取上一次执行的命令的PID,因此,我们现在有了刚刚启动的后台进程的PID。

您提供了read -n1 -rp 'Press any key to continue',所以我可以假设您已经知道这样做了,&& kill $doStuffPid将在kill退出后read进行后台处理(如果您终止,也可以使用使用^C的脚本。

答案 2 :(得分:1)

如果您愿意使用嵌入式Expect,则可以编写:

expect <(cat <<'EOD'
spawn sleep 10
send_user "Press any key to continue\n"
stty raw -echo
expect {
  -i $user_spawn_id -re ".+" {}
  -i $spawn_id eof {}
}
EOD
)

您将用过程替换sleep 10的地方。