Почему другой файл инвентаризации не обрабатывается, даже если он поступает через несколько секунд из другого инвентаря? Используя «-cmin -5» в качестве условия

#bash #shell #ansible

#bash #оболочка #ансибль #ansible

Вопрос:

У меня есть cronjob, который запускается каждые 1 минуту, чтобы получить файл с удаленного сервера, а затем поместить его в мой локальный $INC_INVENT ниже приведен пример файла,

   -rw-r--r-- 1 ansi ansi 46 Sep 21 22:34 inventory_200921223307
  -rw-r--r-- 1 ansi ansi 46 Sep 21 22:35 inventory_200921223406
  

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

 ls -1 $INC_INVENT | grep -v "process" | while read invent_file
do
   check=$( find $INC_INVENT -name $invent_file -cmin -5 )
   if [ ! -z $check ]
   then
       ansible-playbook -i $INC_INVENT/$invent_file  $MAIN/applyPatch.yml -vv >> $LOG/linuxpatching.log.$$ 2>amp;1
       mv  $INC_INVENT/$invent_file $PROCES
       exit
   else
      exit
   fi
done
  

Проблема в том, что обрабатывается только файл (inventory_200921223307), другой файл (inventory_200921223406) больше не обрабатывается playbook. Кажется, больше не соответствует условию » -cmin -5″? Моя цель — любой НОВЫЙ поступающий файл будет обработан, я добавил -cmin -5, чтобы избежать повторной обработки файла инвентаризации, если он еще не перемещен в process dir это плохой подход или есть лучший способ добиться этого? Заранее благодарю.

 -rw-r--r-- 1 ansi ansi 46 Sep 21 22:34 inventory_200921223307
  

Ответ №1:

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

Я бы исправил это, немного переписав цикл:

 find . $INC_INVENT -cmin -5 | grep -v "process" | while read invent_file
do
       ansible-playbook -i $INC_INVENT/$invent_file  $MAIN/applyPatch.yml -vv >> $LOG/linuxpatching.log.$$ 2>amp;1
       mv $INC_INVENT/$invent_file $PROCES
done
  

Таким образом, вы сначала запрашиваете соответствующие данные, а затем просто обрабатываете их без необходимости проверять их позже в цикле очереди