LINUX.ORG.RU

Функция выполняется 2 раза, не пойму почему

 ,


0

2

Здравствуйте! Ребят, наваял я скриптик, который запускает отслеживание вновь появляющихся файлов в шарах (inotifywait) и вызывает их сканирование (clamscan). С терминала запускаю в фоне, потому что иначе выполнения скрипта не дождаться. Вот скрипт:

#!/bin/bash

clamav-scan-files ()
{
   dir=$1
   inotifywait -m -q -r -e create --format '%w%f' $dir | \
   while read line; do
      scanresult=$(clamscan -r --no-summary --move=/mnt/data/shares/admins/Quarantine "$line")
      dtime=`date +"%d.%m.%Y %T"`
      echo "$dtime $scanresult" >> /var/log/clamav/scan-files.log 2>&1
   done
}

clamav-scan-files /mnt/data/shares/public/ &
clamav-scan-files /mnt/data/shares/mycats/ &
clamav-scan-files /mnt/data/shares/office/ &
Но вот после выполения скрипта я вижу следующее:
root@gw:~# ps aux | grep clam
root      1629  0.0  0.0  11920   640 ?        S    11:05   0:00 /bin/bash executable_scripts/clamav-scan-files
root      1630  0.0  0.0  11920   644 ?        S    11:05   0:00 /bin/bash executable_scripts/clamav-scan-files
root      1631  0.0  0.0  11920   640 ?        S    11:05   0:00 /bin/bash executable_scripts/clamav-scan-files
root      1634  0.0  0.0  11920   404 ?        S    11:05   0:00 /bin/bash executable_scripts/clamav-scan-files
root      1635  0.0  0.0  11920   412 ?        S    11:05   0:00 /bin/bash executable_scripts/clamav-scan-files
root      1637  0.0  0.0  11920   844 ?        S    11:05   0:00 /bin/bash executable_scripts/clamav-scan-files
root      3015  0.0  0.0   9012   872 pts/2    S+   11:36   0:00 grep clam
clamav   29838  0.0  0.1  80888  9812 ?        Ss   Апр14  14:07 /usr/bin/freshclam -d --quiet --config-file=/etc/clamav/freshclam.conf --pid=/run/clamav/freshclam.pid
root@gw:~# ps aux | grep inot
root      1632  0.0  0.0   6264   644 ?        S    11:05   0:00 inotifywait -m -q -r -e create --format %w%f /mnt/data/shares/public/
root      1633  0.0  0.0   6504   772 ?        S    11:05   0:00 inotifywait -m -q -r -e create --format %w%f /mnt/data/shares/mycats/
root      1636  0.0  0.0   7400  1688 ?        S    11:05   0:00 inotifywait -m -q -r -e create --format %w%f /mnt/data/shares/office/
root      3018  0.0  0.0   9012   868 pts/2    S+   11:36   0:00 grep inot
root@gw:~#
Функция запускается дважды, по два экземпляра на каждый мой вызов. Почему происходит такая ерунда?


Если я правильно понял о чём вы, то один это сам скрипт, другой это subshell для ″while read″ вывода ″inotifywait″. Или у clamscan по два раза на файл запускается (по записям в логах)?

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

По записям в логах один раз сканирует. Вообще оно работает как надо, просто странно что вместо 3х экземпляров функции я вижу 6. Может быть это как вы говорите какой-то субшелл. Я сам не программист ) и даже скрипты писать толком не умею.

gard
() автор топика

Жесть какая! clamscan запускается не быстро.

1) Через clamdscan оно будет работать значительно веселее.

2) реагировать нужно на close_write,move_to - остальное не интересно.

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

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

А close_write, move_to добавлю. )

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

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

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

Да, уже запустил демона, а команду поменял на clamdscan.
Но вот при сканировании файлов вручную командой clamdscan он будет брать настройки из своего конфига? Вот этот момент немного недопонимаю. Так-то сам демон мне не нужен, но работает он конечно моментально.

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

у clamd есть свой конфиг.

У clamdscan нет конфига, т.к. он использует clamd

И еще - зачем запускать 3 inotifywait ? он умеет смотреть за несколькими каталогами.

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

Ну когда споткнётесь об это, будете знать что гуглить. А спотыкаются об subshell обычно при попытке передать из него переменную в основной код. Типа как здесь:

count=0; grep foo bar | while read line; do ((count++)); done; echo "number of lines: $count"

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

Хм... интересно, посмотрим как это сделать (слежка за неск. каталогами).

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

Ну все, теперь запускается в одном экземпляре, я избавился от функции раз можно указать для inotifywait сразу несколько директорий через пробел:

root@gw:~# cat executable_scripts/clamav-scan-files
dirs_for_scan=$(cat /root/executable_scripts/clamav-scan-list-for-cron | tr '\n' ' ')

inotifywait -m -q -r -e create,close_write,moved_to --format '%w%f' $dirs_for_scan | \
while read line; do
   scanresult=$(clamdscan --no-summary --move=/mnt/data/shares/admins/Quarantine "$line")
   dtime=`date +"%d.%m.%Y %T"`
   echo "$dtime $scanresult" >> /var/log/clamav/scan-files.log 2>&1
done &
root@gw:~# cat executable_scripts/clamav-scan-list-for-cron
/mnt/data/shares/office
/mnt/data/shares/mycats
/mnt/data/shares/public
root@gw:~# ps aux | grep clamav-scan-files
root     16984  0.0  0.0  11916   888 pts/1    S    21:47   0:00 /bin/bash executable_scripts/clamav-scan-files
root     17057  0.0  0.0   9012   876 pts/1    S+   21:50   0:00 grep clamav-scan-files
root@gw:~# ps aux | grep inotify
root     16983  0.1  0.0   7436  1856 pts/1    S    21:47   0:00 inotifywait -m -q -r -e create,close_write,moved_to --format %w%f /mnt/data/shares/office /mnt/data/shares/mycats /mnt/data/shares/public
root     17059  0.0  0.0   9012   872 pts/1    S+   21:50   0:00 grep inotify
Однако, если убрать в конце скрипта & и выполнять его в фоне - функции будет две. А именно так все работает. :)
Всем спасибо большое за помощь!

gard
() автор топика

В общем ребят, это я сам балбес )
Не функция запускалась в двойном экземпляре. Сам скрипт имел точно такое-же наименование, отсюда и 6 одноименных процессов.

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