it-swarm.com.de

Wie führe ich ein Skript unter Linux automatisch aus?

Ich benutze die Linux-Kommandozeile und bin ein Anfänger. Ich habe zwei Dateien erstellt, test.sh und test.log. der Prozess ist jede Ausgabe, die zu test.log geht, und ich erhalte erfolgreich die Ausgabe in test.log. Ich möchte alle 5 Sekunden automatisch ein Skript ausführen und nur schreiben, wenn sich an der Datei .sh etwas geändert hat.

test.sh enthält:

#!/bin/bash
while [ true ] ;
do
echo "" date and Time >> test.log
date +%x_r >> test.log
lsusb >> test.log

sleep 5;
done

Meine Frage: Gibt es eine Möglichkeit, es automatisch auszuführen und nur die neue Änderung in der Datei mit dem neuen Datum anzufügen? Wenn zum Beispiel jemand ein USB-Gerät an mein Gerät anschließt, wird es mit dem neuen Datum in die vorhandene Protokolldatei eingefügt.

3
Ghassan

Dies sollte funktionieren, es speichert die letzte Ausgabe von lsusb in $ lastoutput und hängt sie an, wenn sie nicht gleich sind

#!/bin/bash
while [ true ] 
do
    currentoutput="$(lsusb)"
    if [ "$currentoutput" != "$lastoutput" ]
    then
        echo "" date and Time >> test.log
        date +%x_r >> test.log
        lastoutput="$(lsusb)"
        lsusb >> test.log
    fi
    sleep 5
done
1
Evan Chen

Anstatt immer die gesamte Ausgabe von lsusb zu protokollieren, können Sie diff verwenden, um nur die Änderungen auszugeben.

#!/bin/bash

logfile="test.log"
lsusbout_before=

while sleep 1; do
    lsusbout_now="$(lsusb)"
    diff=$(diff <(printf '%s\n' "$lsusbout_before") <(printf '%s\n' "$lsusbout_now"))
    if [ $? = 1 ]; then
        date | tee -a "$logfile"
        printf '%s\n' "$diff" | grep '^[<>]' | tee -a "$logfile"
        lsusbout_before="$lsusbout_now"
    fi
done

Immer wenn etwas hinzugefügt wird, gibt diff Folgendes aus:

> ...

wenn etwas entfernt wird, ist die Ausgabe

< ...

z.B. wenn ich meinen USB-Stick anschließe:

Fr 12. Apr 10:55:48 CEST 2019
> Bus 002 Device 014: ID 8564:1000 Transcend Information, Inc. JetFlash

Dieses Skript verwendet diff Fehlercode 1, wenn sich die Dateien unterscheiden.

  • <(command) Dateideskriptor: Erzeugt eine Datei im Speicher mit der Ausgabe von command als Eingabe, ähnlich wie $(command).
  • [ $? = 1 ] Fehlercode des letzten Befehls prüfen (hier: diff).
  • grep '^[<>]' soll die zusätzliche Ausgabe von diff unterdrücken, wie die Position von Änderungen, die für uns irrelevant ist.
0
pLumo