後臺進程符號:&
本篇博客將會介紹符號“&”在不同場景下的使用,包括:
使用1:後臺運行,包括後臺一些操作,作業引用、怎樣提交後臺作業、怎樣拉回前臺查看等等
使用2:文件描述符引用
一、後臺運行:
① 作用:提供後臺運行機制。可以以後臺進程方式運行命令,而無需等待命令執行完成
② 使用:在命令行最後加一個“&”即可。
③ 表現方式:增加“&”後,會輸出後臺進程的作業號和進程ID;而進程就在後臺默默的執行。
腳本舉例:
腳本實現功能:死循環
腳本文件testBack,代碼如下:
#!/bin/bash
number=1
sum=0
max=100
while [ "$number" -le "$max" ]
do
sum=`expr $sum + $number`
number=`expr $number + 1`
number=1 #通過給number一個恆定值1,讓while死循環
done
source ./sum100 >/dev/null
echo $sum
執行命令:bash testBack &
輸出: [1] 22476
分析:1表示作業號 22476表示進程ID
從舉例代碼中延伸的問題:
問題1:被分配的作業號和進程ID是唯一的嗎?
是唯一的。
問題2:後臺進程的輸出數據可能隨時出現在用戶的終端屏幕上,如何解決?
方法一:應該可以通過輸出重定向,把輸出數據整個輸出到文件中,防止意外輸出到屏幕。
方法二:使用命令:stty tostop,這個命令將會禁止後臺作業輸出數據
問題3:如何查看後臺進程?
查看後臺進程命令:jobs
輸出:[1]+ Runing bash testBack &
分析:作業號 運行狀態 後臺作業的命令行
問題4:如何殺死一個後臺進程?
命令:kill %1
分析:“1”是要殺死那個進程的作業號,%1表示使用作業號引用後臺作業
問題5:如何把一個後臺作業提交到前臺運行
命令:fg %1
分析:%1表示作業號“1”對應的後臺作業
前臺運行的BUG:作業在前臺運行時,如果不結束,則其它命令無法輸入。
問題6:如何將一個正在運行的前臺程序設置爲後臺進程?
作用:防止一個前臺進程運行時間太長,一直佔用着資源。
步驟1:組合鍵Ctrl Z(避免使用Ctrl C,因爲這樣會直接殺死一個前臺進程)
輸出:[1]+ Stopped bash testBack &
分析:分配的作業號 當前作業的狀態 命令行
會向Shell和當前程序發送一個STOP信號,後續操作有兩種,輸入命令:bg或fg。
步驟2:選擇一:把作業放到後臺繼續運行
命令: bg %1
分析:bg命令會把“%1”代表的作業放在後臺繼續執行
選擇二:把作業放到前臺繼續執行
命令: fg %1
分析:fg命令會把“%1”代表的作業放在前臺繼續執行
問題7:如何引用作業
作用:在對作業進行操作時,首先必須知道如何引用這個作業。
方式1:%number:使用number作業號引用後臺作業
方式2:%string :使用給定string,作爲命令起始字符串引用作業
方式3:%?string:這個就是整個命令中包含給定字符串的作業
方式4:%% %+ :這兩個都表示引用當前作業
方式5:%- :引用前一個作業
二、描述符對應的文件引用:
“&”符號還可以用來和文件描述符進行搭配使用
首先,文件描述符是做什麼用的?
Linux系統會爲每一個打開的文件分配一個文件描述符,相當於一個打開文件在系統中的代號。這個代號可以和&結合使用,用於指向這個打開的文件。
文件描述符常見的有:
標準輸入,文件描述符爲0;
標準輸出,文件描述符爲1;
標準錯誤輸出,文件描述符爲2
作用:主要是用在I/O重定向中,比如,把一個命令的輸出重定向到一個&i指向的文件。