Variablen in einem gegabelten Prozess von außerhalb dieser Gabel ändern?

Variablen in einem gegabelten Prozess von außerhalb dieser Gabel ändern?

Theoretisch sollte bei diesem Block „running...“ nur einmal (oder weniger) angezeigt werden, aber in der Praxis wiederholt es sich, bis es manuell beendet wird. Wie ändere ich den Wert von x innerhalb des gegabelten Prozesses von außerhalb des gegabelten Prozesses auf „false“, nachdem die Funktion „start“ aufgerufen wurde?

export x=true
start() {
while [ $x == true ]; do
    echo running...
    sleep 1
done
}

start &
x=false

Antwort1

Die einfache Lösung besteht darin, eine Art Interprozesskommunikation zu verwenden, um dem Zielprozess mitzuteilen, dass er die Änderung vornehmen soll. Sie könnten beispielsweise Signale verwenden:

#!/bin/sh

export x=true
start() {
trap x=false USR1
while [ $x = "true" ]; do
    echo running...
    sleep 1
done
}

start &
sleep 5
kill -USR1 $!
wait

erzeugt diese Ausgabe:

$ ./testit.sh
running...
running...
running...
running...
running...
$

Antwort2

Wenn Sie verwenden ksh93, können Sie Disziplinfunktionen verwenden, um gemeinsame Variablen zu implementieren (siehehttps://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get)

Alternativ können Sie Folgendes verwenden, fishdas diese Funktion über einen Daemon implementiert:Fischd.

verwandte Informationen