Есть ли возможность позволить бесконечному циклу 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??
Из обсуждения в реве комментариев вопрос стало очевидно, что то, что хочет 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
Демонстрационный исходный код сценария:
#!/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
можно хотеть читать также:
удара <час>Используйте break
встроенный для остановки while
цикл.
От help break
:
break: break [n]
Exit for, while, or until loops.
Exit a FOR, WHILE or UNTIL loop. If N is specified, break N enclosing
loops.
Exit Status:
The exit status is 0 unless N is not greater than or equal to 1.
Таким образом в Вашем отрывке, можно сделать:
while :; do
if [ -n "$var1" ] ; then
break
fi
done
Или еще короче:
while :; do
[ -n "$var1" ] && break
done
Для передачи любого входа функции используйте позиционные параметры т.е. аргументы. Первый аргумент может быть получен $1
, второй $2
и так далее.
Например, если Вы вызываете функцию foobar
:
foobar spam
В функции можно использовать, добираются spam
при помощи $1
:
$ foobar () { echo "This is $1" ;}
$ foobar spam
This is spam