2012-11-08 86 views
2

我有一個冗長的菜單腳本,它依賴於它的變量的幾個命令輸出。這些命令需要幾秒鐘才能運行,我想生成新的進程來設置這些變量。它看起來是這樣的:在KSH衍生的過程中設置變量

VAR1=`somecommand` & 
VAR2=`somecommand` & 
... 
wait 
echo $VAR1 $VAR2 

問題是,進程產生並死於他們設置的變量。我意識到我可以通過將這些文件發送到一個文件然後閱讀,但我想在沒有臨時文件的情況下執行此操作。有任何想法嗎?

+0

Korn shell還不支持多線程。有一天它可能會得到支持,但現在不是。還是你混淆了線程和進程? – cdarke

+0

我想我理解你的問題,問題是你需要多線程或非阻塞的管道或套接字。現在Korn shell既不支持。你需要一個更強大的語言。 – cdarke

+0

是的,我的錯誤。 &將產生一個不是線程的新進程。而且我僅限於ksh,所以我不能使用更強大的語言。 – hsoj48

回答

0

可以使用命令替換,就像得到了全過程的產出:

VAR1=$(somecommand &) 
VAR2=$(somecommand &) 
... 
wait 
echo $VAR1 $VAR2 
+0

不幸的是,這個方法仍然阻塞,直到進程完成,因爲它在設置變量之前等待「somecommand」完成。 – hsoj48

+0

由於您不想被阻止,因此無法通過不同的流程來實現這一目標。因爲'&'創建了一個新的進程,進程無法使用某些IPC機制來引導交換數據。 爲什麼你不想使用臨時文件?如果你不想要數據,你可以在獲得數據後刪除權利。 –

0

這是非常笨拙,但對我的作品。我有三個腳本。

cmd.sh是你的「somecommand」,它僅僅是一個測試腳本:

#!/bin/ksh 
sleep 10 
echo "End of job $1" 

下面是wrapper.sh,運行一個命令,捕獲輸出,信號完成後父,然後寫結果到stdout:

#!/bin/ksh 
sig=$1 
shift 
var=$([email protected]) 
kill -$sig $PPID 
echo $var 

這裏是父腳本:

#!/bin/ksh 

trap "read -u3 out1" SIGUSR1 
trap "read -p out2" SIGUSR2 

./wrapper.sh SIGUSR1 ./cmd.sh one |& 
exec 3<&p 
exec 4>&p 

./wrapper.sh SIGUSR2 ./cmd.sh two |& 
wait 
wait 
echo "out1: $out1, out2: $out2" 
echo "Ended" 

2x等待,因爲第一個將被中斷。

在父腳本中,我運行包裝器兩次,每次運行一次,傳遞要運行的命令和任何參數。 |&表示「管道到背景」 - 作爲一個協同進程運行。

這兩個exec命令將管道文件描述符複製到fds 3和4.作業完成後,包裝器將通知主進程讀取管道。使用trap捕獲信號,該程序讀取適當子進程的管道並收集結果數據。

相當複雜和笨重,但它似乎工作。

+0

下面是一個鏈接,解釋協同過程如何工作:http://www.dartmouth.edu/~rc/classes/ksh/coprocesses.html#top – tomkaith13