读命令不在后台工作

时间:2016-04-18 21:47:38

标签: bash background-process

目前,我正在编写一个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

1 个答案:

答案 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,如果它们仍然在运行。