LINUX.ORG.RU
ФорумAdmin

мониторинг на остановку прихода файлов....?

 , ,


1

1
приветствую!
есть система, в которой есть каталог /data, и под ним некоторые подкаталоги - /data/ecm, /data/rvs, /data/zli, итдп.

во все эти каталоги достаточно регулярно валятся файлы - идёт распределение и обработка.

возможно ли написать скрипт на баше, который будет караулить файлы, и скажем, если в последние десять минут с текущего момента ниодного свежего файла не появилось в дефинированных каталогах - будет отправлять мне письмо с сабджектом " шеф, всё пропало!" (ц)?

искал в гугле чтото такое, ненашёл ни одного решения такой проблемы...
mail -s «kaput» часть я сам наваяю, мне бы механизм который проверяет нет ли свежих фацлов в каталогах за х минут, и если их нет - то выполнение команды....

спасибо заранее....
Ответ на: комментарий от futurama

Постараюсь. Большой поток файлов вообще не так надо обрабатывать, имхо.

dhameoelin ★★★★★
()

про auditd было ?

anonymous
()
Ответ на: комментарий от wisedraco

количество файлов в этих каталогах всех вместе врядли будет более пары - тройки сотен - старое будет раз в несколько часов удалятся другим скриптом...

Тогда можно проще, чем у devzero :) :

while true ; do
	if [[ -z $(find "$DATA_PATH" -type f -mmin -10 -printf x) ]] ; then
		echo "шеф, всё пропало!"
		sleep 10m
	fi
	sleep 2m
done

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

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

Если вы хотите ориентироваться на файловые даты, то можно только с использованием какой-то другой программы (stat, date, find).

Если же именно на *наличие* файлов, то можно и просто на Баше (ну, со sleep’ом еще).

Однако стесняюсь спросить, если даже такая несложная задачка ставит вас в тупик, то откуда берется условие на ГНУ Баш? Не все ли вам равно, на каком языке не мочь ее решить? ;-)

Zmicier ★★★★★
()
Ответ на: . от Dob

а что если «Запоминать» размер каталога и сравнивать предыдущее с последующим значением.

Размер каталога не меняется при добавлении в него файлов.

А вот если задаться условием, что файлы только «валятся» (но не удаляются, например), то сравнивать *даты* каталогов становится совершенно разумным решением.

Ну, к примеру:

#!/bin/bash

dirs=('/data/foo'
      '/data/goo')

for ((;;)); do
    current_state=$(stat -c '%Y' "${dirs[@]}")

    if [[ $current_state == $prior_state ]]; then
        panic
    fi

    sleep 1m
    prior_state=$current_state
done

(Не проверял.)

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от dhameoelin

Я думаю, что был акцент в плане «не на каком-то [другом] ЯП»

Ну вот я и спрашиваю о причинах такого акцента.

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

Вы серьезно?

[dob@DarkStar ~/Downloads]$ du -h ttt
16K	ttt
[dob@DarkStar ~/Downloads]$ echo "sdasdasdasdasdafdsafasdfa" > ttt/4
[dob@DarkStar ~/Downloads]$ du -h ttt
20K	ttt

Dob
()
Ответ на: комментарий от Dob

Вы серьезно?

Конечно. Ну по крайней мере не обязан.

$ mkdir dir
$ stat -c '%s' dir
4096
$ echo 'A line.' > dir/file
$ stat -c '%s' dir
4096

$ du -h ttt

А почему бы не md5 сумму?

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

с каким скриптом? %)
это коммент к посту от Zmicier

Вы серьезно?

[dob@DarkStar ~/Downloads]$ du -h ttt
16K	ttt
[dob@DarkStar ~/Downloads]$ echo "sdasdasdasdasdafdsafasdfa" > ttt/4
[dob@DarkStar ~/Downloads]$ du -h ttt
20K	ttt

к

Размер каталога не меняется при добавлении в него файлов.


В первичной постановке задачи не было условия, что файлы будут удаляться....

Dob
()
Ответ на: комментарий от Dob

с каким скриптом?

С тем, который будет основан на вашей дурацкой идее.

В первичной постановке задачи не было условия,

Ну так в треде были пояснения. Прийти в тред и ляпнуть возражение посреди обсуждения, не читая его, как минимум невежливо.

И вообще

Размер каталога

это вы понимаете в вульгарном смысле, на самом деле по правильному — это совсем не то, но это уже вам Zmicier объяснит, он любит докопаться до столба не по делу.

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

Спасибо!
Я предложил свою «дурацкую» идею перед тем как TC пояснил, что на самом деле ему надо.

Dob
()
Ответ на: комментарий от teod0r

Есть там всё:

for (( expr1 ; expr2 ; expr3 )) ; do list ; done
              First, the arithmetic expression expr1 is evaluated according to
              the  rules  described  below  under  ARITHMETIC EVALUATION.  The
              arithmetic expression expr2 is then evaluated  repeatedly  until
              it  evaluates  to zero.  Each time expr2 evaluates to a non-zero
              value, list is executed and the arithmetic expression  expr3  is
              evaluated.   If  any  expression is omitted, it behaves as if it
              evaluates to 1.  The return value is the exit status of the last
              command  in  list  that  is  executed,  or  false  if any of the
              expressions is invalid.

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

и что в текущем контексте оно означает, если не заданы expr1, expr2, expr3?
я проверил, получается бесконечный цикл

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

а что означает это ((;;))?

Бесконечный цикл.

в man bash не нашёл

Как подсказывает аноним, это не так, но вообще — мало чего там можно не найти. Всегда обращайтесь к полной документации, а не к урезанной.

я проверил, получается бесконечный цикл

Ну вот его и означает. :-)

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

  ага, спасибо - и за первое, и за второе... и остальным, кто в топике примеры дал - тоже спасибо, видел про определение времени последнего созданного файла... старый я стал, умаялся, а завтра ещё праздник - пастафарианская пятница, а у меня опять нет священных тефтелей...

ну да ладно, как нибудь восстановлю энергию и желание чтонибудь делать, творить...;)

wisedraco ★★
() автор топика
Ответ на: комментарий от ya-betmen

я хочу максимально универсальный скрипт, который работал бы везде без доп телодвижений, установок спецсофта.

а на баше - потому что я там уже чтото малыми местами узнаю, и у меня там хотябы отдалённое понимание, местами, есть - что оно делает, и как его несколько подправить, в случае надобности. ну и универсальность - опять же...

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

Ну, тогда тебе в начало треда. Мой скрипт основывается на incron и без него бесполезен.

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

Вот смотри, черновик какой-то такой:

#!/bin/bash

PIDFILE=/tmp/monitor.pid
TIMEOUT=600

##########################################

OLD_PID="$(test -s ${PIDFILE} && cat ${PIDFILE})"

if [[ -n "${OLD_PID}" ]]; then
    if [[ -n "$(ps -A | awk '{print $1}' | grep ${OLD_PID})" ]]; then
        kill -9 ${OLD_PID}
    fi
fi

##########################################

echo $$ > ${PIDFILE}
sleep ${TIMEOUT}
ip a | tail -n +7 | mail -s "You've died 10 minutes ago..." root

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

Явные минусы: вызывать надо из-под ограниченной учётки, чтобы не прибить чужие процессы. Так что incron нужно настроить соответственно. После убийства предыдущего скрипта в памяти остаются sleep'ы, так как я в черновике не использую PGID.

Из неявных плюсов - incron может передать скрипту имя файла, на который скрипт был вызван. Из этого имени можно спокойно выдрать mtime и отправлять его почтой.

Из явных плюсов: скрипт в памяти висит один. Свежезапущеный вытеснит старый.

В принципе, прототип у меня и на сотне файлов работал, но нужно ли тебе оно?

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

Здесь не должно оставаться висящих в фоне sleep'ов:

#!/bin/bash

PIDFILE=/tmp/monitor.pid
TIMEOUT=600

##########################################

OLD_PID="$(test -s ${PIDFILE} && cat ${PIDFILE})"

if [[ -n "${OLD_PID}" ]]; then
    if [[ -n "$(ps -A | awk '{print $1}' | grep ${OLD_PID})" ]]; then
        kill -- -$(ps -o pgid= ${OLD_PID} | grep -o '[0-9]*')
    fi
fi

##########################################

echo $$ > ${PIDFILE}
sleep ${TIMEOUT}
ip a | tail -n +7 | mail -s "You've died 10 minutes ago..." root
wisedraco, ты так и не озвучил, нужно ли тебе оно вообще, так что я пока остановлюсь.

dhameoelin ★★★★★
()
Последнее исправление: dhameoelin (всего исправлений: 1)
Ответ на: комментарий от wisedraco

Ну тогда так

while true; do
    COUNT=$(find . -mmin -10 -type f | wc -l)
    if [ $COUNT eq 0 ]; then
        #ACHTUNG!!!
    fi
    sleep 60
done;

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от dhameoelin

а, да, спасибо - это интересное решение, но я наверное выберу чтото универсальное на баше всётаки... Но всё равно спасибо - возможно, когда то мне и решение на инкроне пригодится, сохраню в своём каталоге с пригожими скриптами...

2бетмен: спасибо и тебе, завтра, наверное, тестану, если лень не одолеет. если одолеет - тогда на той неделе...:)

вообще - спасибо вам всем! я уж несколько отчаялся, в стакэсчендже мой вопрос вообще поставили на холд и бортанули - мол, «слишком обще сформулировано» - а вы здесь мне так помогли! большое спасибо ! :)

wisedraco ★★
() автор топика
Ответ на: . от Dob

Самое идиотское решение. Один файл удалили, другой такого же размера добавили, изменили файл по содержанию но размер остался тем же и т.п... и добавьте сюда что фалов больше одного.

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