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

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

理論上、このブロックでは「実行中...」は 1 回 (またはそれ以下) しか表示されませんが、実際には手動で強制終了されるまで繰り返し表示されます。関数「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デーモンを通じてこの機能を実装する を使用することもできます。魚類

関連情報