1. 程式人生 > >shell 後臺和子程序後臺管控

shell 後臺和子程序後臺管控

後臺數可控是避免資源過度佔用的有效控制;子程序裡的後臺狀態檢測實現複雜,這裡提供一種方式。

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 函式起到阻塞等待的作用。