Tips en Trucs 2022

Realtime log bestanden monitoren en reageren

Met de tail -f opdracht kan je realtime log bestanden volgen. Maar nog handiger is dat je bij een bepaalde melding een opdracht start om automatisch op de melding te reageren.

Bestanden regel voor regel verwerken

Standaard wordt de uitvoer van een opdracht op zijn geheel doorgegeven (pipe) aan een andere opdracht. M.a.w. gebufferd. De manier van bufferen kan je echter beïnvloeden met de stdbuf opdracht. Om dit te demonstreren maken we eerst een virtueel test logboek aan:

dany@pindabook:~> echo Eerste regel > dummy.log 
dany@pindabook:~> echo Tweede regel >> dummy.log 
dany@pindabook:~> echo Derde regel >> dummy.log 
dany@pindabook:~> cat dummy.log 
Eerste regel
Tweede regel
Derde regel

Start een tweede terminal waarin we met de tail -f opdracht het aangemaakte logboek constant in de gaten houden. De uitvoer van de tail -f opdracht sturen we regel per regel (stdbuf -oL) naar de cat opdracht. De uitvoer van de cat opdracht wordt regel per regel doorgestuurd naar de uniq opdracht waardoor je enkel uitvoer ziet indien er in het logboek een regel wordt toegevoegd die verschilt van de voorgaande regel:

dany@pindabook:~> tail -f dummy.log | stdbuf -oL cat | uniq
Eerste regel
Tweede regel
Derde regel
Vierde regel
^C

De tail -f opdracht toont direct de eerste drie regels. In de eerste terminal waarin we het logboek hebben aangemaakt, sturen we twee regels naar het virtuele logboek:

dany@pindabook:~> echo Derde regel >> dummy.log 
dany@pindabook:~> echo Vierde regel >> dummy.log

In de tweede terminal waarin de tail -f opdracht nog steeds draait, zie je maar één extra regel verschijnen, namelijk de laatste, want deze is niet dezelfde (uniek) als de voorgaande regel. De tail -f opdracht kan je afbreken met de sneltoets Ctrl+c.

Praktijktoepassing

Het nieuwe 64 bits Raspberry Pi Bullseye besturingssysteem gebruikt volledig vernieuwde camerasoftware. Deze heeft veel meer mogelijkheden, zoals het detecteren van beweging. Ideaal om enkel met een Pi camera een bewegingsdetector te maken waarbij bij elke gedetecteerde beweging een foto wordt genomen. De libcamera-hello opdracht werkt daarbij als bewegingsdetector. Bij een beweging verschijnen in de uitvoer van deze opdracht de woorden 'Motion detected'. Bij het verschijnen van deze woorden in de uitvoer, wordt de libcamera-hello opdracht afgebroken. De Pi camera komt dan vrij om met de opdracht libcamera-still een foto te nemen. Plaats je deze twee opdracht een oneindige lus (while true do done) en je hebt een bewegingsdetectie die bij elke beweging een foto neemt.

#! /bin/sh -
# Activeer de regelbuffer voor de tail opdracht
# en stuur de uitvoer ervan door naar een while lus voor verder onderzoek
stdbuf -oL tail -f dummy.log 1> >(while IFS= read -r line
  do # Lus waarin elke tail uitvoerregel wordt onderzocht
    # Bevat de uitvoerregel het woord Reageer?
    echo "$line" | grep "Reageer"
    if [ $? = 0 ]; then # De uitvoerregel bevat het woord Reageer
      echo Hier kan je reageren met opdrachten
    fi
  done
)
dany@pindabook:~> bash realtime.sh 
Reageer op deze regel
Hier kan je reageren met opdrachten
^C
dany@pindabook:~> echo Geen reactie op deze regel >> dummy.log
dany@pindabook:~> echo Reageer op deze regel >> dummy.log
Realtime
#! /bin/sh -
motion=$(cat << EOF
{
    "motion_detect" :
    {
	"roi_x" : 0.1,
	"roi_y" : 0.1,
	"roi_width" : 0.8,
	"roi_height" : 0.8,
	"difference_m" : 0.1,
	"difference_c" : 10,
	"region_threshold" : 0.005,
	"frame_period" : 5,
	"hskip" : 2,
	"vskip" : 2,
	"verbose" : 1
    }
}
EOF
)
echo $motion > /tmp/postProcess.json

while true
do
  stdbuf -oL libcamera-hello --timeout 0  --nopreview --lores-width 128 --lores-height 96 --post-process-file /tmp/postProcess.json 2> >(while IFS= read -r line
    do
      echo "$line" | grep "Motion detected"
      if [ $? = 0 ]; then
        echo Foto nemen
        break
      fi
    done
  )
  libcamera-still -o "$(date +'%Y %m %d %H:%M:%S').jpg" --nopreview --immediate --saturation 0
done