shell 後臺和子程序後臺管控
阿新 • • 發佈:2019-02-01
後臺數可控是避免資源過度佔用的有效控制;子程序裡的後臺狀態檢測實現複雜,這裡提供一種方式。
1、管道和後臺在同一個指令碼
cat fifo.sh
#! /bin/bash
ls /proc/self/fd # 獲取已用檔案操作符
ulimit -n # 可用最多檔案操作符個數
mkfifo fifo_1001 # 建立管道檔案
# 三個標準檔案操作符,分別為 0、1、2; 對應 stdin ,stdout, stderr
exec 1001<>fifo_1001 # 繫結檔案操作符和管道檔案
rm -rf fifo_1001 # 刪除管道檔案
# 寫 10 個管道
for (( j = 0 ; j < 10; j++ ));do
echo >&1001
done
# 讀一個管道
read -u1002
{
# do something
echo >&1001 # 寫管道
} &
wait # 等待所有後臺執行結束
exec 1001>&- && exec 1001<&- # 關閉檔案操作符
上述指令碼可以實現 10 個後臺程序的併發執行。
2、 管道和後臺不在一個指令碼
cat fifo.sh
#! /bin/bash
# 檔案操作符 FIFO 當前可讀次數為 fifo_len 時返回
function wait_fifo()
{
ufifo=0
FIFO=$1 # 檔案操作符
fifo_len=$2 # 檔案操作符最大可讀次數
FIFO_FREE_CK=$3 # 獲取當前檔案可讀次數
while (( ${ufifo} < ${fifo_len} ));do
ufifo=$(eval ${FIFO_FREE_CK})
# 將已讀的重寫
for(( i = 0; i < ${ufifo}; i++ ));do
echo >&${FIFO}
done
let tWait=${fifo_len}-${ufifo}
sleep ${tWait} # sleep 1s this must need
done
}
ls /proc/self/fd # 獲取已用檔案操作符
ulimit -n # 可用最多檔案操作符個數
mkfifo fifo_1002 # 建立管道檔案
# 三個標準檔案操作符,分別為 0、1、2; 對應 stdin ,stdout, stderr
exec 1002<>fifo_1002 # 繫結檔案操作符和管道檔案
rm -rf fifo_1002 # 刪除管道檔案
# 寫 10 個管道
FIFO_LEN=10
for (( j = 0; j < ${FIFO_LEN}; j++ ));do
echo >&1002
done
# 返回 1002 可讀次數
for (( j = 0; j < ${FIFO_LEN}; j++ ));do
echo >&1002
let jj=$j+1
if [ ${jj} -eq ${FIFO_LEN} ];then
FIFO_WAIT="${FIFO_WAIT}(read -t 0.01 -u1002 || (echo $j && false)) && (echo ${jj})"
else
FIFO_WAIT="${FIFO_WAIT}(read -t 0.01 -u1002 || (echo $j && false)) && "
fi
done
for (( i = 0; i < 8; i++ ));do
Multi_process1.sh
done
for (( i = 0; i < 8; i++ ));do
Multi_process2.sh
done
# wait 這裡 wait 不在起作用
wait_fifo 1002 "${FIFO_LEN}" "${FIFO_WAIT}" # 1002可讀${FIFO_LEN} 則繼續執行
exec 1002>&- && exec 1002<&- # 關閉檔案操作符
cat Multi_process1.sh
#! /bin/bash
# 讀一個管道
read -u1002
{
# do something 1
echo >&1002 # 寫管道
} &
cat Multi_process2.sh
#! /bin/bash
# 讀一個管道
read -u1002
{
# do something 2
echo >&1002 # 寫管道
} &
wait_fifo 函式起到阻塞等待的作用。