LINUX.ORG.RU

[bash] Демон и события

 


0

2

Есть демон на bash. В нем цикл, какой-то такой:

while true
do

	sleep $KEEPTIME
	действие
done

Причём sleep в минутах. При этом «действие» должно совершаться так же по некоторому событию и желательно не через минуты, а сам демон должен подождать ещё какое-то время если действие в последний раз было вполнено по событию. Как это сделать?

Пока придумал так - пусть действие по событию выполнит другой скрипт, а демону отправит сигнал (например USR1) об этом, узнав о его PID из заранее оговоренного файла (например /dev/shm/mydaemon.pid). В демон при этом добавим что-то типа: trap 'sleep $ЕЩЁЧУТЬЧУТЬ' SIGUSR1.

Но что-то мне так не нравится. Какие ещё можно придумать способы?

★★★★★
Ответ на: комментарий от anonymous

Думал, но не понял как. А как тогда по таймеру дергаться? Или вынести само действие в ещё один скрипт и пусть он слушает канал, а в канал писать из приведённого цикла и из скрипта стартующего по событию? Но тогда получится 2 демона.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

чет типа

cat /tmp/fifo | {
  while read line;
     do
        echo $line
     done
}

по идее cat и read будут спать пока чет не прилетит

Skolotovich ★★★
()

после выполнения действия кидай метку времени, когда должно выполнится следующее действие во временный файл, а sleep организуй циклом с минимальной задержкой и сравнением текущего времени с заданной меткой

ananas ★★★★★
()

а еще можно для этого at заюзать

Skolotovich ★★★
()

Спасибо, всем. Я понял свою ошибку - у меня нарушен принцип «одна программа - одна задача».

Сейчас переделываю всё так - будет демон который будет слушать трубу (надеюсь это не хавает много ресурсов), а кто ему будет слать команды в трубу разберемся потом. Вобщем пусть всё будет событиями.

Suntechnic ★★★★★
() автор топика

(while true ; do действие ; kill -STOP $$ ) &
pid=$!
( while sleep время ; do kill -CONT $pid ; done )&
( while read ; do kill -CONT $pid ; done <труба )&

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.