我有一個冗長的菜單腳本,它依賴於它的變量的幾個命令輸出。這些命令需要幾秒鐘才能運行,我想生成新的進程來設置這些變量。它看起來是這樣的:在KSH衍生的過程中設置變量
VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2
問題是,進程產生並死於他們設置的變量。我意識到我可以通過將這些文件發送到一個文件然後閱讀,但我想在沒有臨時文件的情況下執行此操作。有任何想法嗎?
我有一個冗長的菜單腳本,它依賴於它的變量的幾個命令輸出。這些命令需要幾秒鐘才能運行,我想生成新的進程來設置這些變量。它看起來是這樣的:在KSH衍生的過程中設置變量
VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2
問題是,進程產生並死於他們設置的變量。我意識到我可以通過將這些文件發送到一個文件然後閱讀,但我想在沒有臨時文件的情況下執行此操作。有任何想法嗎?
可以使用命令替換,就像得到了全過程的產出:
VAR1=$(somecommand &)
VAR2=$(somecommand &)
...
wait
echo $VAR1 $VAR2
不幸的是,這個方法仍然阻塞,直到進程完成,因爲它在設置變量之前等待「somecommand」完成。 – hsoj48
由於您不想被阻止,因此無法通過不同的流程來實現這一目標。因爲'&'創建了一個新的進程,進程無法使用某些IPC機制來引導交換數據。 爲什麼你不想使用臨時文件?如果你不想要數據,你可以在獲得數據後刪除權利。 –
這是非常笨拙,但對我的作品。我有三個腳本。
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
捕獲信號,該程序讀取適當子進程的管道並收集結果數據。
相當複雜和笨重,但它似乎工作。
下面是一個鏈接,解釋協同過程如何工作:http://www.dartmouth.edu/~rc/classes/ksh/coprocesses.html#top – tomkaith13
Korn shell還不支持多線程。有一天它可能會得到支持,但現在不是。還是你混淆了線程和進程? – cdarke
我想我理解你的問題,問題是你需要多線程或非阻塞的管道或套接字。現在Korn shell既不支持。你需要一個更強大的語言。 – cdarke
是的,我的錯誤。 &將產生一個不是線程的新進程。而且我僅限於ksh,所以我不能使用更強大的語言。 – hsoj48