我想运行带有在子线程中启动的看门狗功能的bash脚本,当给定变量达到某个值时,该脚本将停止我的程序。该变量在主线程中递增。
var=0
function watchdog()
{
if [[ $var -ge 3 ]]; then
echo "Error"
fi
}
{ watchdog;} &
# main program loop
((var++))
此代码中的问题是$ var保持为0。我也尝试在看门狗调用中不使用{},同样的结果。
我的代码风格好吗?
答案 0 :(得分:1)
您无法在bash
中的进程之间共享变量,并且它不支持多线程。因此,您需要一种形式的进程间通信。最简单的方法之一就是使用命名管道,也称为FIFO。
以下是示例:
pipe='/tmp/mypipe'
mkfifo "$pipe"
var=0
# Your definition is not strictly correct (although it will work)
watchdog()
{
# Note the loop
while read var
do
if (( var >= 3 )) # a better way to do numeric comparisons
then
echo "Error $var"
else
echo "$var"
fi
sleep 2 # to prevent CPU hogging
done
}
watchdog < "$pipe" & # No need for a group
# main program loop - ??? I see no loop
((var++))
echo "$var" > "$pipe"
((var++))
echo "$var" > "$pipe"
((var++))
echo "$var" > "$pipe"
echo "waiting"
wait
rm "$pipe"
示例运行:
$ bash gash.sh
1
waiting
2
Error 3
但是我真的看不到使用单独的过程的意义。为什么不只是在每次更改后调用一个函数来测试值?
答案 1 :(得分:0)
如果以前使用.
运行bashscript,它将使用相同的环境,并且可以更改现有变量。看这个:
$ cat test.sh
#!/usr/bin/env bash
a=12
echo $a
$ a=1
$ echo $a
1
$ ./test.sh
12
$ echo $a
1
$ . ./test.sh
12
$ echo $a
12
我运行. ./test.sh
后,变量$ a已通过脚本更改。