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?

Aha
quelle
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.

Sven
quelle
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"
Janne Pikkarainen
quelle
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.

Sven
quelle
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