是否有一个选项可以让无限的 while 循环作为函数在后台运行时,在任何给定时刻使用局部变量停止和开始运行?我已经尝试了很多选择,只是我无法找到一个简洁的解决方案。我让它工作的唯一方法是从 while 循环中读取外部文本文件。并在程序中的指定点将 0 或 1 写入该文本文件。
我现在正在做的是:
#!/bin/bash
intr(){ while true # function endless while loop start
do
sleep 0.5 # execute function every x time
var1=`grep "1" 0or1.txt` # read file 0or1.txt
if [ -n "$var1" ] ; then # if text =1 execute function,
# do some magic..
fi
done
} # end function
intr & # execute function as bg process
#some code # located some where in the script
echo "1" > 0or1.txt # write 1 to start function
#some code # this should be a local variable??
#some code # located some where in the script
echo "0" > 0or1.txt # write 0 to stop function
#some code # this should be a local variable??
Run Code Online (Sandbox Code Playgroud)
从下面的评论中的讨论中可以看出,OP 想要的基本上是暂停后台功能。引用:
@ serg,主要目标是让这段代码充当中断。在程序中的几个点上我需要禁用“中断”,并且在几个点上我需要启用它。(这不是一次性事件。)
-SIGSTOP使用和可以做到这一点-SIGCONT。这两个信号本质上是进程的暂停和播放按钮。波纹管是根据我最初发布的内容修改的演示脚本。本质上,我已经产生了无穷无尽的函数作为后台进程,并且首先发送-SIGSTOP然后再发送-SIGCONT给它。这里最重要的一点是,即使主进程退出,后台进程也将继续运行,因此在下面的示例中,中断不会停止输出到控制台,除非我从另一个kill 1234终端发出,其中 1234 是函数 PID从脚本中报告。所以要注意这一点
$ ./someInfiniteLoop.sh
We are in the main, about to spawn the interrupt function
Parent process (the script itself) 7119
Captured 7120
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
Sending SIGSTOP to 7120
Funciton paused; waiting 3 seconds
You could do something else when function is paused
Function resumed
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
>>>> HEY I'M THE 1 SECOND INTERRUPT
Run Code Online (Sandbox Code Playgroud)
演示脚本源代码:
#!/bin/bash
# use the line bellow if you want to silence error messages
# exec 2>/dev/null
endless()
{
while true
do
echo ">>>> HEY I'M THE 1 SECOND INTERRUPT"
sleep 1
done
}
echo 'We are in the main, about to spawn the interrupt function'
echo "Parent process (the script itself) $$"
endless &
endless_pid="$!"
echo "Captured $endless_pid"
sleep 3
echo 'Sending SIGSTOP to ' $endless_pid
kill -SIGSTOP $endless_pid
[ $? -eq 0 ] && echo 'Funciton paused; waiting 3 seconds' || echo 'Something is wrong'
echo 'You could do something else when function is paused'
sleep 3
kill -SIGCONT $endless_pid
[ $? -eq 0 ] && echo 'Function resumed' || echo 'Something is wrong'
sleep 3 && exit 0
Run Code Online (Sandbox Code Playgroud)
您可能还想阅读: