Como fazer um script rodar como um daemon aguardando mudanças em 2 arquivos?

4

Eu sou novo no script, eu fiz um script que lê 2 arquivos e executa comandos e como saída de um arquivo de log.

Eu quero que este script seja executado como um daemon e aguarde as alterações nesses dois arquivos para executar esses comandos novamente nesses arquivos.

Estou ciente do uso de alguns inotify, mas não sei exatamente como usá-lo e onde colocar o loop para que o script funcione como eu quero também, ou seja:

  1. o usuário executa o script pela primeira vez
  2. este script lê esses arquivos e faz o log de saída
  3. o script "dorme" (daemonizado) até que esses 2 arquivos de log sejam alterados (algumas linhas são adicionadas a eles)
  4. execute o mesmo script novamente nesses arquivos
  5. durma novamente e aguarde as alterações nesses dois arquivos
por Hamza Elghoul 20.12.2016 / 13:29

3 respostas

1

Eu tive que monitorar um software antigo, que não tem opções de log suficientes. Não é exatamente o que você quer, mas pode ajudá-lo.

  • compara 2 arquivos ( ref.cfg e cur.cfg ) a cada segundo
  • registra no arquivo cfg.log se um diff for detectado
  • faz um diff em um arquivo se uma alteração for detectada
  • faz um backup do arquivo com o sufixo de data

watch_cfg.sh :

#!/bin/bash

cfg_reference="/tmp/ref.cfg"
cfg_current="/tmp/cur.cfg"

while true; 
do 
  cfg1=$(cat $cfg_reference)
  cfg2=$(cat $cfg_current)
  date_current="$(date +"%F_%T")"
  diff_detected=false
  test "$cfg1" = "$cfg2" || diff_detected=true
  if [ "$diff_detected" = true ]; then
    printf "$date_current [cfg] diff detected\n" >> cfg.log
    diff $cfg_reference $ecfg_current > "./cfg_diff/cur.cfg_${date_current}"
    cp -a "$cfg_reference" "./cfg_old/cur.cfg_before_${date_current}"
    cp -a "$cfg_current" "$cfg_reference"
  fi
  sleep 1
done

Execute os comandos:

chmod +x watch_cfg.sh
nohup ./watch_cfg.sh  > /dev/null 2>&1 &

Isso desanexa o processo da sessão atual e o envia para o segundo plano.

    
por 20.12.2016 / 14:38
1

Eu pensei que isso poderia te ajudar, então vou postar como uma "resposta" (se eu pudesse apenas comentar, eu faria isso).

link

O exemplo 4 pode estar na área do que você está tentando fazer. Eu usei isso no passado distante com bons resultados.

./fileschanged -r dir | while read file ; do
  if [ "${file}" == "x" ] ; then
    handle_file_x_script "${file}"
  else if [ "${file}" == "y" ] ; then
    handle_file_y_script "${file}"
  fi
done
    
por 20.12.2016 / 14:06
0

Você pode usar incron para ouvir eventos de inotificação. Pacotes estão disponíveis na distribuição debian-like (ubuntu,…) e provavelmente em outros também

    
por 20.12.2016 / 17:26