为了避免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时退出吗?
答案 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
变量。