フォーク外でフォークされたプロセスの変数を変更しますか?

フォーク外でフォークされたプロセスの変数を変更しますか?

理論的には、このブロックを使用すると、「実行中...」は一度(またはそれ以下)しか表示されませんが、実際には手動で終了するまで繰り返されます。 「start」関数を呼び出した後、分岐されたプロセスの外側から分岐されたプロセスの内部のx値をfalseに変更するにはどうすればよいですか?

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

start &
x=false

答え1

ここでの簡単な解決策は、ある種のプロセス間通信を使用してターゲットプロセスに変更を通知することです。たとえば、次の信号を使用できます。

#!/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

次の出力を生成します。

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

答え2

を使用している場合は、ksh93フィールド関数を使用して共有変数を実装できます(参照:https://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get)

あるいはfish、それを使用してデーモンを介してこの機能を実装することもできます。魚d

関連情報