Woher weiß man, welche Datei oder welcher Inode eine systemd.path-Unit ausgelöst hat?

1963
Tim

Systemd bietet Unit - Dateien, die inotify Überwachung eines bestimmten Weg Trog steuern: systemd.path(5). Wenn eine Datei oder ein Verzeichnis im überwachten Pfad geändert wird, wird das entsprechende systemd.service(5)Objekt aufgerufen.

Laut der inotify(7)Manpage:

Um festzustellen, welche Ereignisse aufgetreten sind, liest (2) eine Anwendung den inotify-Dateideskriptor. Wenn bisher keine Ereignisse aufgetreten sind, wird read (2) unter der Annahme eines blockierenden Dateideskriptors so lange blockiert, bis mindestens ein Ereignis eintritt (es sei denn, es wird durch ein Signal unterbrochen. In diesem Fall schlägt der Aufruf mit dem Fehler EINTR fehl, siehe Signal (7 )).

Jedes erfolgreiche Lesen (2) gibt einen Puffer zurück, der eine oder mehrere der folgenden Strukturen enthält:

 struct inotify_event { int wd; /* Watch descriptor */ uint32_t mask; /* Mask of events */ uint32_t cookie; /* Unique cookie associating related events (for rename(2)) */ uint32_t len; /* Size of name field */ char name[]; /* Optional null-terminated name */ }; 

Wenn systemd eine Änderung im überwachten Pfad sieht, gibt es eine Möglichkeit, Daten aus dem read(2)Befehl zu erhalten? Insbesondere brauche name[]ich das als Argument für den Befehl ExecStart=in der systemd.service(5)unit-Anweisung.

[Service] ExecStart=/usr/bin/command --file=$inotifyName 
5
Klar gibt es: Kann man C programmieren? MariusMatutiae vor 10 Jahren 0
Nee. Weisen Sie einfach darauf hin, dass ein Programm, das inotify verwendet, `read (2)` enthalten kann, um mit dem Ereignis zu arbeiten. Wie benutzt systemd es also und kann ich Daten aus `read (2)` in einer systemd-Unit-Datei als Variable oder Bezeichner verwenden? Tim vor 10 Jahren 0
Dies geschieht aus einem C-Programm heraus: read (2) ist ein System, das Sie von Mann zu Mann überprüfen können. MariusMatutiae vor 10 Jahren 0
Ich weiß, lesen (2) ist ein Systemaufruf. Ich möchte nichts mit lesen (2) machen. Ich möchte einen Befehl aus einer `systemd.service`-Datei ausführen, die durch eine` systemd.path`-Datei ausgelöst wird, die wiederum inotify verwendet und * davon ausgeht, dass sie etwas wie `read (2)` verwendet. Ich brauche einen String mit dem Dateinamen, der das Ereignis ausgelöst hat, das an die `ExecStart`-Anweisung in der Unit-Datei angehängt wurde. Tim vor 10 Jahren 0
Hast du herausgefunden? Ich schaue mir auch ein Skript an. CMCDragonkai vor 8 Jahren 1
@Tim Ich weiß, dass dies vor einiger Zeit gepostet wurde - hast du eine Lösung gefunden? Mo Friedrich vor 5 Jahren 0
Hi, nein noch nie gefunden (ich habe aufgehört ehrlich zu sein) Tim vor 5 Jahren 0
systemd übergibt seinen Dateideskriptor, der inotify open geöffnet hat, nicht an den aufgerufenen Prozess. Der Python [inotify] (https://pypi.org/project/inotify/) sollte leicht genug sein, um ein Skript zu erstellen. danblack vor 5 Jahren 0

0 Antworten auf die Frage