2017-05-21 60 views
1

我在Ubuntu的一個bash腳本,激活功能(即我也寫了)這是位於同一個腳本,並設置它在後臺運行,以下列方式:如何從外部更改bash腳本中的全局變量,以便更改反映在while循環中?

my script: 
. 
. 
my_func & 
do some stuff (that i don't know how much time it's gonna take) 
global_var=1 

my_func,並將是一個函數有一個while循環,它的條件是運行,而

global_var -ne 1 

但它不起作用。在將值更改爲1後,循環中的更改似乎不會傳播到函數,因爲while循環保持運行。

my_func,並將收集的統計數據對我的腳本性能,因此它具有優雅finsih,我不能只是程序完成後強制殺死它。這就是爲什麼我必須能夠告訴它停止。

需要幫助,告訴它停下來。

+0

後臺進程不能在同一個shell中運行,並且不會與父shell共享內存。 – choroba

+2

每個子shell都有它自己的環境副本,你最好創建一個鎖文件或類似的東西,並檢查它是否存在,這將獨立於shell環境。 – 123

回答

0

,當你在後臺運行,此功能不共享與運行腳本訪問或存儲。你將需要使用其他方法。

最優雅的方式將看到,如果你不能得到函數本身明白它需要停止。然而,如果在你的情況下這是不可能的,最古老和最簡單的方法之一就是擁有一個共享數據文件,其中包含你需要在腳本中共同使用的變量。

所以不是全局變量,而是寫入vars.txt,stopfunction = 1 ,並在後臺腳本中不斷檢查每個循環的文件(或數據庫)以查看變量是什麼。

或者如果你的程序允許這種格式您可以導出數據。把你的函數放到另一個shell腳本中,然後從後臺運行它。

#!/bin/sh 

globalvar="something" 
export globalvar 
./2.sh & 

echo "finished" 

,然後在2.sh

#!/bin/sh 

sleep 5 
echo "this is global: $globalvar" 

例如,我不知道這是否會爲你的情況下工作,但香港專業教育學院使用了類似的技巧腳本像什麼,它聽起來就像你正試圖做。

雖然這種方法將需要改變全局變量和調用腳本的發生是某種更大的循環,即使它們是異步的。