从分叉外部更改分叉进程中的变量?

从分叉外部更改分叉进程中的变量?

理论上,使用此块,您应该只看到“正在运行...”一次(或更少),但实际上,它会重复,直到被手动终止。调用函数“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

相关内容