Wie man Befehle bei Datei- oder Verzeichnisänderungen mit Incron auf Ubuntu 16.04 ausführt

Dieses Tutorial zeigt Ihnen, wie Sie incron auf einem Ubuntu 16.04 (Xenial Xerus) System verwenden können, um Befehle auszuführen, wenn eine Datei oder ein Verzeichnis geändert wird. Der incron-Daemon ist ähnlich wie cron, aber anstatt zeitabhängige Befehle auszuführen, kann er Befehle auslösen, wenn ein Datei- oder Verzeichnisereignis eintritt (z.B. eine Dateiänderung, Änderungen von Berechtigungen, etc.).

1 Installieren von Incron

Die folgenden Schritte müssen als root-Benutzer ausgeführt werden. Bitte loggen Sie sich in die Shell Ihres Ubuntu-Systems ein und werden Sie root mit:

sudo -s

Die Incron-Software ist im Ubuntu-Repository verfügbar. Deshalb werde ich es mit apt wie diesem installieren:

apt-get -y install incron

Installation von Incron auf Ubuntu 16.04

3 Wie man Incron benutzt

Wie im ersten Kapitel erwähnt, hat Incron viele Ähnlichkeiten mit dem Cron-Tool. Wo Cron seinen crontab-Befehl zur Verwaltung von Cronjobs hat, hat Incron den Befehl incrontab. Sie können die Liste der incrontab-Befehlsoptionen (-l), bearbeiten (-e) und entfernen (-r) verwenden, um incrontab-Einträge anzuzeigen und zu ändern.

Führen Sie den folgenden Befehl aus, um einen vollständigen Überblick über incrontab zu erhalten:

man incrontab

In der Man Page findest du den folgenden Hinweis:

Wenn /etc/incron.allow existiert, dürfen nur die hier aufgeführten Benutzer incron verwenden. Andernfalls, wenn /etc/incron.deny existiert, dürfen nur die hier nicht aufgeführten Benutzer incron verwenden. Wenn keine dieser Dateien existiert, darf jeder incron verwenden. (Wichtiger Hinweis: Dieses Verhalten ist unsicher und wird wahrscheinlich geändert, um mit dem von ISC Cron verwendeten Stil kompatibel zu sein.) Der Speicherort dieser Dateien kann in der Konfiguration geändert werden.

Das bedeutet, wenn wir incrontab als root verwenden wollen, müssen wir /etc/incron.allow (was unsicher ist) löschen…..

rm -f /etc/incron.allow

…. oder wir fügen den Root-Benutzer zur Datei incron.allow hinzu (was die empfohlene Option ist). Öffnen Sie die Datei /etc/incron.allow:

nano /etc/incron.allow

Und fügen Sie die folgende Zeile hinzu.

root

Bevor Sie dies tun, erhalten Sie Fehlermeldungen wie diese, wenn Sie versuchen, incrontab zu verwenden:

server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#

Danach funktioniert es:

server1:~# incrontab -l
no table for root
server1:~#

Wir können nun diesen Befehl verwenden:

incrontab -e

Um Incron-Jobs zu erstellen, werfen wir nun einen genaueren Blick auf die Man Page, um die Syntax zu verstehen.

man 5 incrontab

Die Manpage zeigt das Format der Cron-Registerkartenzeilen, das diesem Schema entspricht:

<path> <mask> <command>

…wobei <path> ein Verzeichnis oder eine Datei ist. Bitte beachten Sie, dass incron nicht in der Lage ist, Dateien in Unterverzeichnissen des von Ihnen eingestellten Verzeichnisses zu betrachten, so dass nur Dateien in diesem Verzeichnis beobachtet werden.

<mask> kann eine der folgenden Optionen sein:

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

Wenn Sie ein Verzeichnis überwachen, können die mit einem Sternchen (*) gekennzeichneten Ereignisse für Dateien im Verzeichnis auftreten, wobei das Namensfeld in den
zurückgegebenen Ereignisdaten den Namen der Datei im Verzeichnis identifiziert.

Das Symbol IN_ALL_EVENTS ist als Bitmaske für alle oben genannten Ereignisse definiert. Zwei weitere Komfortsymbole sind IN_MOVE, eine Kombination aus IN_MOVED_FROM und IN_MOVED_TO, und IN_CLOSE, eine Kombination aus IN_CLOSE_WRITE und IN_CLOSE_NOWRITE.

Die folgenden weiteren Symbole können in der Maske angegeben werden:

IN_DONT_FOLLOW      Don't dereference pathname if it is a symbolic link
IN_ONESHOT          Monitor pathname for only one event
IN_ONLYDIR          Only watch pathname if it is a directory

Zusätzlich gibt es ein Symbol, das nicht im Benachrichtigungssatz enthalten ist. Es ist IN_NO_LOOP. Dieses Symbol deaktiviert Überwachungsereignisse, bis das aktuelle Ereignis vollständig behandelt wird (bis sein Unterprozess beendet wird).

<command> ist der Befehl, der ausgeführt werden soll, wenn das Ereignis eintritt. Die folgenden Platzhalter können innerhalb der Befehlsspezifikation verwendet werden:

$$   dollar sign
$@   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

Wenn Sie ein Verzeichnis beobachten, dann enthält $@ den Verzeichnispfad und $# die Datei, die das Ereignis ausgelöst hat. Wenn Sie eine Datei ansehen, dann enthält $@ den vollständigen Pfad zur Datei und $# ist leer.

Wenn Sie die Wildcards benötigen, sich aber nicht sicher sind, worauf sie sich beziehen, können Sie einen Inkron-Job wie diesen erstellen.

Erstellen Sie ein Verzeichnis, das überwacht werden soll:

mkdir /tmp/testdir

Öffnen Sie dann die Inkrontabelle:

incrontab -e

und fügen Sie die folgende Zeile hinzu:

/tmp/testdir/ IN_MODIFY echo "$$ $@ $# $% $&"

Dann erstellen oder ändern Sie eine Datei im Verzeichnis /tmp/testdir/ und schauen sich /var/log/syslog an – dieses Protokoll zeigt an, wann ein Incron-Job ausgelöst wurde, ob er erfolgreich war oder ob es Fehler gab und was der eigentliche Befehl war, den er ausgeführt hat (d.h. die Wildcards werden durch ihre tatsächlichen Werte ersetzt).

Zu Testzwecken werde ich zwei Dateien hinzufügen, helloworld.txt und helloworld2.txt in /tmp/testdir/ mit dem echo-Befehl:

echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt

Also lasst uns den Syslog mit Schwanz auf Inkremente überprüfen:

tail /var/log/syslog
...
Apr 12 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")

Jetzt genug Theorie. Lasst uns unsere ersten Inkron-Jobs erstellen. Ich möchte die Datei /etc/apache2/apache2.conf und das Verzeichnis /etc/apache2/vhosts/ überwachen, und wenn es Änderungen gibt, möchte ich, dass incron den Apache neu startet. So machen wir es:

incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart

Das ist es. Das ist es. Zu Testzwecken können Sie Ihre Apache-Konfiguration ändern und einen Blick auf /var/log/syslog werfen, und Sie sollten sehen, dass incron den Apache neu startet.

HINWEIS: Führen Sie keine Aktionen innerhalb eines Inkron-Jobs in einem von Ihnen überwachten Verzeichnis aus, um Schleifen zu vermeiden. Beispiel: Wenn Sie das Verzeichnis /tmp auf Änderungen überwachen und jede Änderung ein Skript auslöst, das eine Protokolldatei in /tmp schreibt, führt dies zu einer Schleife und kann Ihr System zu hoher Last oder sogar zum Absturz bringen.

Um alle definierten Inkron-Jobs aufzulisten, können Sie ausführen:

incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#

Um alle Inkron-Jobs des aktuellen Benutzers zu löschen, führen Sie:

incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#

4 Links

Das könnte Dich auch interessieren …