目前,我正在编写一个Bash程序,该程序根据随时间变化的条件运行具有不同参数的程序,并在用户按下某个键时退出。它与sudo
一起运行,如果这很重要的话。但是,read
似乎没有收到任何字符,脚本继续运行。为什么会发生这种情况,我该如何解决?我尝试的一个例子:
(
read -sN1
exit
) &
while true; do
command param1 &
pid=$!
while condition; do true; done
kill $pid
command param2 &
pid=$!
until condition; do true; done
kill $pid
done
答案 0 :(得分:0)
一种方法是将外部while循环放在后台并在用户按下某个键后将其终止:
while true; do
pid1=$!
echo $pid1 > /tmp/pid1
while condition; do sleep 1; done
kill $pid1
wait $pid1 2>/dev/null
command param2 &
pid2=$!
echo $pid2 > /tmp/pid2
until condition; do sleep 1; done
kill $pid2
wait $pid2 2>/dev/null
sleep 1
done &
pid3=$!
read -sN1
killlist="$pid3 `pgrep -F /tmp/pid1` `pgrep -F /tmp/pid2`"
kill $killlist
wait $pid3 2>/dev/null
rm -f /tmp/pid1 /tmp/pid2
我添加了一些睡眠命令,以便可能无限的while循环不会使CPU崩溃。
我在按键后添加了对第一个和第二个进程的杀戮。 $ pid1和$ pid2不会为脚本的shell设置,仅适用于外部循环的子shell,因此它们的值需要通过tmp文件传递。
我添加了wait命令来抑制杀戮的输出(https://stackoverflow.com/a/5722874/1563960)。
我使用pgrep -F仅从tmp文件中杀死pids,如果它们仍然在运行。