
理論上、このブロックでは「実行中...」は 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
デーモンを通じてこの機能を実装する を使用することもできます。魚類。