Befehl "watch" zum Benachrichtigen über neu erstellte Dateien unter Linux


7

Befehl watch, um über neu erstellte Dateien unter Linux zu benachrichtigen

Wie ändere ich den folgenden Befehl, um beim Erstellen einer neuen Datei in / usr / local / mydir / durch den Linux-Benutzer John zu benachrichtigen?

watch -d 'ls -l /usr/local/mydir/ | fgrep john'

dh ich möchte kontinuierlich ein anderes Skript überwachen und aufrufen, wenn eine neue Datei in / usr / local / mydir / erstellt wird.

Wie in der Produktion kann ich kein Werkzeug anstelle eines Shell-Skripts verwenden. Kann mir also mit der Shell-Scripting-Lösung helfen?


Warum nicht einfach iwatch verwenden? iwatch.sourceforge.net/index.html . arbeitet für uns.
— Sirex

Antworten:


8

Anstatt ständig ein Verzeichnis auf diese Weise abzurufen, versuchen Sie möglicherweise inotify, das für diesen Zweck entwickelte Subsystem zu verwenden. Informationen zu User Space-Tools finden Sie unter inotify-tools.


6

inotify Der Vorschlag von SvenW ist hierfür eine ausgezeichnete Wahl.

Nur um anders zu sein: Eine alternative, vollständigere Möglichkeit für diese Art von Dingen ist die Verwendung des Kernel-Audit-Subsystems und auditd. Installieren Sie auditdes einfach, wenn es noch nicht installiert ist, und verwenden Sie es dann auditctlin Ihrem Fall

auditctl -w /usr/local/mydir/ -p wa -F uid=john -k johnschangedfiles

würdest du.

Dann können Sie einen Bericht erstellen und ein sehr detailliertes Protokoll darüber anzeigen, was wann passiert ist:

ausearch -f /usr/local/mydir/

Dies führt zu ähnlichen Ergebnissen:

time->Fri Feb  3 12:45:19 2012
type=PATH msg=audit(1328265919.961:11): item=0 name="/tmp/test/foo" inode=1839907 dev=fd:00 mode=0100664 ouid=500 ogid=500 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0
type=CWD msg=audit(1328265919.961:11):  cwd="/tmp"
type=SYSCALL msg=audit(1328265919.961:11): arch=c000003e syscall=2 success=yes exit=3 a0=7fffa6f4262e a1=941 a2=1b6 a3=3136fb0d0c items=1 ppid=12414 pid=23531 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=686 comm="touch" exe="/bin/touch" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="jpikkschangedfiles"

2

Wenn Sie darauf bestehen, nur Standardwerkzeuge zu verwenden, kann ein Skript wie das folgende hilfreich sein:

#!/bin/bash
ls -l /usr/local/mydir | grep john > /tmp/watchfile

while true; do
   sleep 10
   ls -l /usr/local/mydir | grep john > /tmp/watchfile2
   diff -q /tmp/watchfile /tmp/watchfile2 > /dev/null
   if [ $? -ne 0 ] ; then
       echo "File list changed" 
       exit ;
   fi
   cp /tmp/watchfile2 /tmp/watchfile
done

Ersetzen Sie die echoZeile durch die gewünschte Aktion und entfernen Sie die exitZeile, wenn Sie dieses Skript kontinuierlich ausführen möchten.

Hinweis: Dies wirkt sich auf jede Änderung der Verzeichnisliste aus, auch wenn Dateien nur aktualisiert und nicht hinzugefügt werden.


Vielen Dank für Ihre Antwort ... Wenn jedoch eine Datei aus [/ usr / local / mydir] gelöscht wird, unterscheidet sich dies auch von watchfile und watchfile2. Ich möchte die gewünschte Aktion nur ausführen, wenn die neue Datei in [/ usr / local / mydir] erstellt wird.
— Aha

1
Ja. Es ist schwierig (aber möglich), dies richtig und für jede Situation passend zu machen. Daher empfehle ich erneut, Tools zu verwenden, die für diesen Zweck entwickelt wurden.
— Sven
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.