如何更改全局变量并具有以前的功能?

时间:2015-03-24 17:12:58

标签: bash

为了避免XY问题,这就是我要做的事情:

terminate=0
terminated=0

monitor_something() {
  while [ "$terminate" -eq 0 ]; do
    echo "Doing stuff"
    sleep 1
  done
  terminated=1
}

monitor_something &
show_interface

terminate=1
while [ "$terminated" -eq 0 ]; do sleep 0.2; done

这个想法是在后台运行一个循环来处理一些事情(例如重新启动错误的服务或其他),然后显示用户界面。当用户界面退出时,我需要等待monitor_something正确退出,而不是处于中间状态。

问题是monitor_something没有看到terminate中的更改。这是一个问题因为&正在创建一个子shell吗?这是一个用于测试目的的简单脚本:

#! /bin/bash

var=10

func() {
  while true; do
    echo "var: $var"
    sleep 1
  done
}

func &

echo "Init"
sleep 2
echo "Changing var to 5"
var=5
sleep 2
echo "Done"

kill -TERM %1

我的问题是,如何让后台函数看到全局变量的变化并对其做出响应?一般来说,我可以用什么来做我想做的事情?我可以告诉monitor_something忽略TERM信号但是设置一个变量并在该变量变为1时退出吗?

1 个答案:

答案 0 :(得分:1)

monitor_something() {
  stop=0
  trap 'stop=1' TERM
  while [ $stop -eq 0 ]; do
    echo "Doing stuff"
    sleep 1
  done
}

monitor_something & MONITOR_PID=$!
show_interface

kill $MONITOR_PID
wait $MONITOR_PID

kill的调用取代了terminate变量,对wait的调用取代了terminated变量。