後台數可控是避免資源過度占用的有效控制;子程序裡的後台狀態檢測實現複雜,這裡提供一種方式。
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
&wait # 等待所有後台執行結束
exec
1001>&- && exec
1001
<&- # 關閉檔案操作符
上述指令碼可以實現 10 個後台程序的併發執行。
cat fifo.sh
#! /bin/bash
# 檔案操作符 fifo 當前可讀次數為 fifo_len 時返回
function wait_fifo
()< $ ));do
ufifo=$(eval
$) # 將已讀的重寫
for(( i = 0; i < $; i++ ));do
echo >&$
done
let twait=$-$
sleep $
# 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 < $; j++ ));do
echo >&1002
done
# 返回 1002 可讀次數
for (( j = 0; j < $; j++ ));do
echo >&1002
let jj=$j+1
if [ $
-eq$ ];then
fifo_wait="$(read -t 0.01 -u1002 || (echo $j && false)) && (echo $)"
else
fifo_wait="$(read -t 0.01 -u1002 || (echo $j && false)) && "
fidone
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
"$""$"
# 1002可讀$ 則繼續執行
exec
1002>&- && exec
1002
<&- # 關閉檔案操作符
cat multi_process1.sh
#! /bin/bash
# 讀乙個管道
read -u1002
&
cat multi_process2.sh
#! /bin/bash
# 讀乙個管道
read -u1002
&
wait_fifo 函式起到阻塞等待的作用。 用shell指令碼守護後台程序
假如現在在 crond 中新增了乙個每分鐘執行的定時任務如下 1 root cd data sbin sh test.sh dev null 2 1 為了防止上乙個程序還沒完成,下乙個程序就啟動,我們可以建立乙個shell來守護該程序,方法如下 bin sh ps aux grep test ini...
shell程序前後臺轉換
程序前台與後台轉換需要用到以下幾個命令 1.我們最常用到的就是這個命令了.用法就是放在乙個命令的最後,可以把這個命令放到後台去執行.大概用法如下 tail f log 1 21867 這裡 1 代表它是後台執行的乙個 job 編號為 1 這裡 21867 是它的程序號 2.ctrl z 這也是常用到...
oracle服務程序和後台程序區別
oracle程序又分為兩類 伺服器程序和後台程序。伺服器程序用於 處理連線到該例項的使用者程序的請求。當應用和oracele是在同一臺機器上執行,而不再通過網路,一般將使用者程序和它相應的伺服器程序組合成單個的程序,可降低系統開銷。然而,當應用和oracle執行在不同的機器上時,使用者程序經過乙個分...