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.
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.
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
#! /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