Daher muss ich Umgebungsvariablen zwischen Shells austauschen und sicherstellen, dass die Änderungen an den Variablen von allen Shells wie globalen Variablen sofort erkannt werden. Sie müssen sich jedoch auf eine Master-PID beziehen, damit zwei Shell-Skripte ausgeführt werden können, von denen jedes ein Master mit demselben globalen Variablennamen ist. Untergeordnete Elemente ändern nur die Variable, die sich auf ihre Master-PID bezieht.
Ich benutze bash
für Skripte.
Meine aktuellen Forschungen sind folgende:
Module, die
ich gelesen habe, könnte ich dafür ein Modulprojekt verwenden: http://modules.sourceforge.net/ , aber ich habe große Probleme damit, es scheint, es fehlen Beispiele? Auch "Module" ist ein zu allgemeines Wort, über das man nur schwer googeln kann, weil es sich mit vielen anderen Dingen vermischt. Nach einigen Wochen sind meine Hände immer noch leer.
Einfache Textquelldatei
Ich lese auch Ich sollte eine einfache Textdatei zum Speichern / Aktualisieren / Lesen von Variablen als Quellskriptdatei verwenden, flock
um gleichzeitiges Schreiben zu vermeiden. Diesbezüglich gibt es jedoch Probleme, wie die gleichzeitige Änderung der Variablen um zwei Schalen.
Alternativ ist
mir bekannt, dass nach dem Lesen einer "globalen" Variablen durch die Shell dieser Wert beibehalten wird, bis ein weiterer Lesevorgang durchgeführt wird. und eine andere Shell kann es in der Zwischenzeit auch ändern ... Kann
eine sehr schnelle externe Anwendung einen solchen Speicher bereitstellen, und wir würden dann nicht versuchen, Umgebungsvariablen als globale Variablen zu verwenden? Aber ich vermute, dass jede SQL-Lösung zu langsam sein wird ...
quelle
ln -s realfile lockfile
Fail-Exit-Status tun genau das, was Sie gesagt haben: "Warte ein paar Mili ...". Ohne Sperre warten sie nicht auf den Versuch, ein Update durchzuführen. Dieser gleichzeitige Aktualisierungsversuch weist jedoch einen Fehler auf. Ein Prozess kann das neueste Update des anderen Prozesses überschreiben. Ich muss noch einen Testfall vorbereiten, um daran zu arbeiten ...Antworten:
Sie können die Umgebung
export -p
mit.
(den Befehl include) in eine Datei schreiben und in den anderen Instanzen regelmäßig zurücklesen . Wie Sie jedoch bemerken, ist das Ergebnis bei gleichzeitigen Änderungen nicht schön.Wenn Sie möchten, dass Änderungen sofort weitergegeben werden, müssen Sie einen Wrapper um das integrierte
export
Element verwenden, der die Änderungen auch auf die anderen Shells überträgt. Unter Linux können Sie dasflock
Dienstprogramm verwenden.Beachten Sie, dass Sie jedes Mal aufrufen müssen,
global_export
wenn Sie einer exportierten Variablen einen neuen Wert zuweisen.Das ist ziemlich ungeschickt. Es ist wahrscheinlich, dass es einen besseren Weg gibt, um Ihr Problem zu lösen. Der naheliegendste Weg ist, dass jeder Befehl, der diese Umgebungsvariablen verwendet, stattdessen eine Konfigurationsdatei liest.
quelle
fish
Verwenden Sie für die Shell Variablen mit universellem Gültigkeitsbereich :Dies funktioniert natürlich nur über
fish
Shells hinweg , die vom selben Benutzer ausgeführt werden.Wenn Sie es an eine Master-PID binden möchten, fügen Sie es in den Variablennamen ein
quelle
Zusätzlich zu
flock
Giles 'Antwort würde ich etwas Ähnliches tun:Registrieren Sie einen Signalhandler, um die Datei neu zu laden:
Eine Funktion zum Ausschreiben der Datei und zum Senden einer
SIGUSR1
Nachricht an alle Shells, um sie zum erneuten Laden der Datei zu benachrichtigen:Öffnen Sie die Datei, aber machen Sie nichts damit. Dies ist nur so, dass der
fuser
diese Shell signalisieren kann:Die Reihenfolge ist etwas wichtig. Zumindest
exec ...
muss dastrap ...
Teil nach dem Teil sein. Andernfalls könnten wir die Datei öffnen und dann vomfuser
Anruf signalisiert werden , bevor wir unseren Signalhandler registriert haben.HINWEIS: Code ist völlig ungetestet, aber das Prinzip steht.
HINWEIS 2: Dieser Beispielcode richtet sich an Bash.
quelle
Ich möchte Sie zu diesem Zweck auf Named Pipes hinweisen . Hier ist ein gutes Beispiel .
Benannte Pipes werden mit dem folgenden Befehl erstellt:
Sie können einfach schreiben, indem Sie:
Auf der anderen Seite können Sie aus der Pipe lesen als:
Sie können mehrere Pipes erstellen, je nachdem, wie viele Shells sie kommunizieren sollen. Das Gute an Pipes ist, dass sie nicht nur Variablen sind. Sie können tatsächlich alle Daten zwischen den Prozessen übergeben. Sie können ganze Dateien und Textzeilen übergeben, was immer Sie möchten. In diesem Sinne können Sie Ihre Skripte erheblich vereinfachen. Ich kann mir vorstellen, dass Sie die Daten / Datei direkt übergeben können, wenn Ihre Variablen auf einen Speicherort von Daten oder eine Datei verweisen und das andere Skript sie lesen oder abrufen muss, ohne eine Variable zu benötigen.
quelle
Wenn ksh93 eine Option ist, gibt es definitiv eine Möglichkeit, das zu implementieren, was Sie wollen, mit Getter- und Setter-Disziplin-Funktionen, die den Variablenwert von / in einen gemeinsam genutzten Speicher abrufen / speichern.
Weitere Informationen finden Sie unter /programming/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get
Im Gegensatz zur ansonsten nützlichen Funktion für
fish
universelle Variablen haben Sie Zugriff auf die Implementierung, sodass Sie die Wertfreigabe auf eine Gruppe von Prozessen beschränken können, die über einen Mechanismus in Ihrem Anwendungsfall mit einer Master-PID verknüpft sind, während Sie einen einzelnen Namen für die Variable beibehalten.quelle
bash
Wunschliste.bash
wird verwendet, um spätere Funktionen auszuwählen, dieksh
zuerst implementiert wurden.Berücksichtigen Sie Ihre Kommentare, dass Sie einen grundlegenden IPC zwischen Shell-Skripten wünschen. Ich würde nur in Dateien schreiben (mit einer Umbenennung für Atomizität)
Und lassen Sie die Leser regelmäßig ./myvars beziehen.
IPC ist beispielsweise mit Python und dem Multiprocessing-Modul viel einfacher.
quelle
Es gibt auch dieses Projekt ScriptEchoColor :
Es kann automatisch eine DB-Textdatei erstellen und für Sie verwalten. Beim ersten Ausführungsskript wird die BD-Datei erstellt, die anderen Skripte werden als eigene Datenbank mit dieser Datei verknüpft, um Variablenwerte zu bearbeiten, sodass beide Informationen austauschen können.
Ein einfaches Beispiel für die Freigabe dieser Dateien finden Sie im Beispielordner : secExplShareEnvVarsA.sh, secExplShareEnvVarsB.sh
Und auch dort ein synchronisierter (sicherer und konsistenter Lese- / Schreibzugriff) DB-Zugriff: secExplSyncedShareEnvVarsA.sh, secExplSyncedShareEnvVarsB.sh
quelle