Как остановить бесконечный цикл в фоновом режиме?

Есть ли возможность позволить бесконечному циклу 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??
4
задан 27 February 2016 в 02:19

2 ответа

Из обсуждения в реве комментариев вопрос стало очевидно, что то, что хочет 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 

можно хотеть читать также:

удара <час>
1
ответ дан 27 February 2016 в 12:19
  • 1
    Кто лгал об этом Вам? Ubuntu точно так же, как любая другая ОС. - аппаратные-средства - то, что делает их быстро. Моя система устанавливает Linux за менее чем 20 минут и начальные загрузки за 9 секунд (хорошо that' s я считающий секунды;-)). Но that' s из-за ssd. Так аппаратные средства. " если увеличение 4 ГБ к 6 ГБ. это будет хорошо? " Сомневайтесь относительно него. Ваш ЦП и жесткий диск (ssd/hdd) более важны. – Rinzwind 26 May 2017 в 23:05

Используйте 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
1
ответ дан 27 February 2016 в 12:19

Другие вопросы по тегам:

Похожие вопросы: