shell 後台和子程序後台管控

2021-07-31 16:33:42 字數 2165 閱讀 9292

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

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執行在不同的機器上時,使用者程序經過乙個分...