shell子進(jìn)程多任務(wù)實(shí)現(xiàn)進(jìn)程高并發(fā)
多進(jìn)程的作用
提高程序的效率:一些CPU密集型的任務(wù),如數(shù)據(jù)處理、解壓、加密等,使用多進(jìn)程可以提高程序的執(zhí)行效率,更快地完成計(jì)算任務(wù);
實(shí)現(xiàn)更復(fù)雜的功能:多進(jìn)程可以在同一時(shí)間向不同的方向處理不同的任務(wù),可以利用這一特性實(shí)現(xiàn)更加復(fù)雜的功能。
1. 了解實(shí)現(xiàn)多進(jìn)程的方法
Linux 通過(guò)后臺(tái)執(zhí)行,語(yǔ)法如下:
command & nohup command &
兩種方式都可以實(shí)現(xiàn)后臺(tái)運(yùn)行,但也存在區(qū)別。
1. 通過(guò)命令執(zhí)行
command &:輸出的結(jié)果顯示到終端窗口,會(huì)隨著終端窗口退出而退出(不建議)
nohup command &:自動(dòng)將結(jié)果輸出到 nohup.out 文件(即使異常提示)。這種方式不論是終端退出還是ssh斷開(kāi),都不會(huì)影響后臺(tái)進(jìn)程運(yùn)行
如果后臺(tái)進(jìn)程繼續(xù)運(yùn)行,可以通過(guò) jobs 查看
推薦幾個(gè)相關(guān)的命令
jobs #查看后臺(tái)運(yùn)行的任務(wù)列表 bg #將凍結(jié)的任務(wù)運(yùn)行到后臺(tái)( bg [jobs列表號(hào)] ),可以是 Ctrl + Z 停止的進(jìn)程 fg #將后臺(tái)任務(wù)轉(zhuǎn)到前臺(tái)運(yùn)行( fg [jobs列表號(hào)] )
2. 通過(guò) shell 執(zhí)行
兩者的區(qū)別和命令執(zhí)行差不多,如果shell中使用的 command &,但是執(zhí)行shell腳本的是 nohup src.sh & ,那么該子進(jìn)程同樣不會(huì)隨著終端的退出而停止。
不加 nohup
加入 nohup
2. shell 子進(jìn)程應(yīng)用
直接在命令后面加 & 其實(shí)意義不到,可作用的范圍小,一般用于函數(shù)的使用。
定義3個(gè)函數(shù),用 & 方法將函數(shù)變換為子進(jìn)程
proc1(){ echo "我是子進(jìn)程1..." sleep 1000 } proc2(){ echo "我是子進(jìn)程2..." sleep 1000 } proc3(){ echo "我是子進(jìn)程3..." sleep 1000 } proc1 & proc2 & proc3 & wait echo "======== 結(jié)束 ========"
[函數(shù)名] & :表示子進(jìn)程
wait:表示必須等待子進(jìn)程結(jié)束才能執(zhí)行下一步
使用 wait 等待子進(jìn)程,所以主進(jìn)程并不會(huì)退出。來(lái)看一下進(jìn)程信息
如果不使用 wait,程序會(huì)繼續(xù)向下執(zhí)行
proc1(){ echo "我是子進(jìn)程1..." sleep 1000 } proc1 & echo "======== 當(dāng)前進(jìn)程情況 ========" ps xl |grep $$ |grep -v grep
可以看到在沒(méi)有等待子進(jìn)程的情況會(huì)直接向下執(zhí)行,直到結(jié)束也不會(huì)停止子進(jìn)程(此時(shí)的子進(jìn)程的父進(jìn)程已停止,變成了孤兒進(jìn)程被進(jìn)程1接收)
那么如何解決孤兒進(jìn)程呢?可以通過(guò) trap 命令捕獲異常,子進(jìn)程隨著主進(jìn)程的退出而退出
trap "[命令1] ; [命令2] ; [命令3]..." EXIT
sleep 1000 & cpid1="$!" sleep 1001 & cpid2="$!" trap "kill -9 ${cpid1} ${cpid2} 2>/dev/null; echo '退出信號(hào)!'; exit" EXIT echo "======== 當(dāng)前進(jìn)程情況 ========" ps xl |grep $$ |grep -v grep
通過(guò) $! 獲取子進(jìn)程的PID,再使用 trap 捕獲退出信號(hào)時(shí)將其殺死
3. shell 高并發(fā)
通過(guò)上述的方法了解的子進(jìn)程實(shí)現(xiàn)的原理后,高并發(fā)就非常的簡(jiǎn)單(for循環(huán))
proc1(){ for i in {1..10};do echo "我是子進(jìn)程1" & done } proc2(){ for i in {1..10};do echo "我是子進(jìn)程2" & done } proc1 proc2 wait
proc1(){ echo "我是子進(jìn)程1" } proc2(){ echo "我是子進(jìn)程2" } for k in {1..5};do proc1 & proc2 & done wait
到此這篇關(guān)于shell子進(jìn)程多任務(wù)實(shí)現(xiàn)進(jìn)程高并發(fā)的文章就介紹到這了,更多相關(guān)shell子進(jìn)程多任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
設(shè)置Shell腳本開(kāi)機(jī)自啟的方法和實(shí)例
這篇文章主要介紹了設(shè)置Shell腳本開(kāi)機(jī)自啟的方法和實(shí)例,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02Linux下利用Opencv打開(kāi)筆記本攝像頭問(wèn)題
這篇文章主要介紹了Linux下利用Opencv打開(kāi)筆記本攝像頭問(wèn)題,需要的朋友可以參考下2017-08-08shell腳本結(jié)合iptables防端口掃描的實(shí)現(xiàn)
這篇文章主要介紹了shell腳本結(jié)合iptables防端口掃描的實(shí)現(xiàn),中間使用了inotify-tools工具,需要的朋友可以參考下2014-05-05linux下定時(shí)執(zhí)行任務(wù)的方法及crontab 用法說(shuō)明(收集整理)
這篇文章主要介紹了 linux下定時(shí)執(zhí)行任務(wù)的方法及crontab 用法說(shuō)明(收集整理),需要的朋友可以參考下2017-04-04Shell腳本實(shí)現(xiàn)線上服務(wù)器之間對(duì)比文件是否一致
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)線上服務(wù)器之間對(duì)比文件是否一致,本文腳本在特殊環(huán)境下使用,需要的朋友可以參考下2014-12-12