gibt es eine Möglichkeit, einen CP-Prozess fehlschlagen zu lassen/zu verzögern?

gibt es eine Möglichkeit, einen CP-Prozess fehlschlagen zu lassen/zu verzögern?

Dies ist ein hypothetisches Szenario. Angenommen, ich habe einen bestimmten Ordner, der von einem Prozess synchronisiert wird, der Dateien/Ordner über das Internet empfängt. Während dieser Vorgang ausgeführt wird, sollten aus Gründen der Synchronisierung keine CP-Vorgänge in seinem Verzeichnis ausgeführt werden. Kann dies trotzdem erreicht werden?

Antwort1

Es gibt mindestens zwei mögliche Lösungen:

  1. Erstellen Sie ein Wrapper-Skript für cp, das überprüft, ob die Synchronisierung ausgeführt wird, indem es entweder prüft, ob der Prozess ausgeführt wird, oder indem es eine Sperrdatei testet, und den Vorgang abbricht oder verzögert.
  2. Zum LD_PRELOADAnschließen writeund für andere Anrufe.

Das Problem bei der ersten Lösung besteht darin, dass Sie alle zum Schreiben in den Ordner verwendeten Befehle einschließen müssten, z. B. mv, cp, rsync, rm, ln, cat…. Andererseits ist dies recht einfach, funktioniert aber auch nur für Ihren aktuellen Benutzer.

Für die zweite Lösung müssten Sie eine gemeinsam genutzte Bibliothek mit allen Systemaufrufen schreiben, die zum Ändern/Modifizieren des Verzeichnisses verwendet werden, z. B. write, unlink, rename. Diese Lösung würde jedoch mit allen dynamisch verknüpften ausführbaren Dateien funktionieren – Sie müssen also nicht jedes andere Programm anpassen.

Antwort2

Wenn Sie wissen, dass der Synchronisierungsprozess ausgeführt wird und dass nur die folgende Operation möglich ist cp, können Sie SIGSTOPan alle Prozesse eine Anweisung senden, die Ausführung anzuhalten. Nachdem die Synchronisierung abgeschlossen ist, senden Sie an alle Prozesse eine Anweisung, die Ausführung fortzusetzen SIGCONT.

Zu diesem Zweck können Sie kill -s SIGSTOP $(pidof cp)oder verwenden killall -s SIGSTOP cp. In einem Terminal können Sie Ctrl+ verwenden Z, um eine Aufgabe in den Hintergrund zu versetzen („pausieren“). Um die Ausführung fortzusetzen, verwenden Sie den fgBefehl („Vordergrund“, siehe help fg).

Antwort3

Ihr Synchronizer schreibt in das Verzeichnis, anstatt es zu lesen, richtig? Ein Dateisystem-Snapshot oder das Setzen des unveränderlichen Bits ist also nicht möglich.

Wenn Sie den Synchronizer als Root ausführen, können Sie den Eigentümer des Verzeichnisses auf Root und die Berechtigungen auf 700 ändern (rwx------; nur der Eigentümer kann etwas tun). Dadurch werden alle neuen Prozesse, die nicht als Root ausgeführt werden, ausgeschlossen, aber jeder Prozess, der bereits eine Datei oder ein Unterverzeichnis geöffnet hat, kann weiterhin Änderungen vornehmen.

Wenn Sie unter Linux alle Prozesse finden möchten, die aktuell Dateien in Ihrem Baum geöffnet haben, können Sie Folgendes tun lsof +D my_directory. Was Sie mit diesem Wissen tun, hängt jedoch von der Situation ab.

verwandte Informationen