我有一个bash脚本,可在后台运行命令。执行后,将向用户显示:Press any key to continue
(由read -n1 -r -p 'Press any key to continue' value
提供支持)
我想让一些东西在后台监视命令以查看它何时完成,如果是,我仍然希望脚本继续执行。另一方面,该过程可能仍在进行,我想使用户能够按一个键来kill
,而不是等待该过程完成。
我想最简单的可视化方法如下:
用户可以等待计时器变为0,计时器将自动关闭,或者如果单击关闭按钮,计时器将立即关闭。
答案 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
的地方。