溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中的&是什么

發(fā)布時(shí)間:2021-09-01 12:52:02 來(lái)源:億速云 閱讀:290 作者:chen 欄目:系統(tǒng)運(yùn)維

本篇內(nèi)容主要講解“Linux中的&是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Linux中的&是什么”吧!

實(shí)際上,命令的用法并不難,例如  mkdir、touch 和 find 也分別可以簡(jiǎn)單概括為“建立新目錄”、“更新文件”和“在目錄樹(shù)中查找文件”而已。

但如果要理解

mkdir test_dir 2>/dev/null || touch images.txt && find . -iname "*jpg" > backup/dir/images.txt &

這一串命令的目的,以及為什么要這樣寫(xiě),就沒(méi)有這么簡(jiǎn)單了。

關(guān)鍵之處就在于命令之間的連接符號(hào)。掌握了這些符號(hào)的用法,不僅可以讓你更好理解整體的工作原理,還可以讓你知道如何將不同的命令有效地結(jié)合起來(lái),提高工作效率。

在這一篇文章和接下來(lái)的文章中,我會(huì)介紹如何使用 & 號(hào)和管道符號(hào)(|)在不同場(chǎng)景下的使用方法。

幕后工作

我來(lái)舉一個(gè)簡(jiǎn)單的例子,看看如何使用 & 號(hào)將下面這個(gè)命令放到后臺(tái)運(yùn)行:

cp -R original/dir/ backup/dir/

這個(gè)命令的目的是將 original/dir/ 的內(nèi)容遞歸地復(fù)制到 backup/dir/  中。雖然看起來(lái)很簡(jiǎn)單,但是如果原目錄里面的文件太大,在執(zhí)行過(guò)程中終端就會(huì)一直被卡住。

所以,可以在命令的末尾加上一個(gè) & 號(hào),將這個(gè)任務(wù)放到后臺(tái)去執(zhí)行:

cp -R original/dir/ backup/dir/ &

任務(wù)被放到后臺(tái)執(zhí)行之后,就可以立即繼續(xù)在同一個(gè)終端上工作了,甚至關(guān)閉終端也不影響這個(gè)任務(wù)的正常執(zhí)行。需要注意的是,如果要求這個(gè)任務(wù)輸出內(nèi)容到標(biāo)準(zhǔn)輸出中(例如  echo 或 ls),即使使用了 &,也會(huì)等待這些輸出任務(wù)在前臺(tái)運(yùn)行完畢。

當(dāng)使用 & 將一個(gè)進(jìn)程放置到后臺(tái)運(yùn)行的時(shí)候,Bash 會(huì)提示這個(gè)進(jìn)程的進(jìn)程 ID。在 Linux 系統(tǒng)中運(yùn)行的每一個(gè)進(jìn)程都有一個(gè)唯一的進(jìn)程  ID,你可以使用進(jìn)程 ID 來(lái)暫停、恢復(fù)或者終止對(duì)應(yīng)的進(jìn)程,因此進(jìn)程 ID 是非常重要的。

這個(gè)時(shí)候,只要你還停留在啟動(dòng)進(jìn)程的終端當(dāng)中,就可以使用以下幾個(gè)命令來(lái)對(duì)管理后臺(tái)進(jìn)程:

  •  jobs 命令可以顯示當(dāng)前終端正在運(yùn)行的進(jìn)程,包括前臺(tái)運(yùn)行和后臺(tái)運(yùn)行的進(jìn)程。它對(duì)每個(gè)正在執(zhí)行中的進(jìn)程任務(wù)分配了一個(gè)序號(hào)(這個(gè)序號(hào)不是進(jìn)程  ID),可以使用這些序號(hào)來(lái)引用各個(gè)進(jìn)程任務(wù)。

$ jobs [1]- Running cp -i -R original/dir/* backup/dir/ & [2]+ Running find . -iname "*jpg" > backup/dir/images.txt &
  •  fg 命令可以將后臺(tái)運(yùn)行的進(jìn)程任務(wù)放到前臺(tái)運(yùn)行,這樣可以比較方便地進(jìn)行交互。根據(jù) jobs命令提供的進(jìn)程任務(wù)序號(hào),再在前面加上 %  符號(hào),就可以把相應(yīng)的進(jìn)程任務(wù)放到前臺(tái)運(yùn)行。

$ fg %1 # 將上面序號(hào)為 1 的 cp 任務(wù)放到前臺(tái)運(yùn)行cp -i -R original/dir/* backup/dir/

如果這個(gè)進(jìn)程任務(wù)是暫停狀態(tài),fg 命令會(huì)將它啟動(dòng)起來(lái)。

  • 使用 ctrl+z 組合鍵可以將前臺(tái)運(yùn)行的任務(wù)暫停,僅僅是暫停,而不是將任務(wù)終止。當(dāng)使用 fg 或者 bg  命令將任務(wù)重新啟動(dòng)起來(lái)的時(shí)候,任務(wù)會(huì)從被暫停的位置開(kāi)始執(zhí)行。但 sleep[4] 命令是一個(gè)特例,sleep 任務(wù)被暫停的時(shí)間會(huì)計(jì)算在 sleep  時(shí)間之內(nèi)。因?yàn)?sleep 命令依據(jù)的是系統(tǒng)時(shí)鐘的時(shí)間,而不是實(shí)際運(yùn)行的時(shí)間。也就是說(shuō),如果運(yùn)行了 sleep 30,然后將任務(wù)暫停 30  秒以上,那么任務(wù)恢復(fù)執(zhí)行的時(shí)候會(huì)立即終止并退出。? bg 命令會(huì)將任務(wù)放置到后臺(tái)執(zhí)行,如果任務(wù)是暫停狀態(tài),也會(huì)被啟動(dòng)起來(lái)。

$ bg %1 [1]+ cp -i -R original/dir/* backup/dir/ &

如上所述,以上幾個(gè)命令只能在同一個(gè)終端里才能使用。如果啟動(dòng)進(jìn)程任務(wù)的終端被關(guān)閉了,或者切換到了另一個(gè)終端,以上幾個(gè)命令就無(wú)法使用了。

如果要在另一個(gè)終端管理后臺(tái)進(jìn)程,就需要其它工具了。例如可以使用 kill[5] 命令從另一個(gè)終端終止某個(gè)進(jìn)程:

kill -s STOP <PID>

這里的 PID 就是使用 & 將進(jìn)程放到后臺(tái)時(shí) Bash 顯示的那個(gè)進(jìn)程 ID。如果你當(dāng)時(shí)沒(méi)有把進(jìn)程 ID 記錄下來(lái),也可以使用 ps 命令(代表  process)來(lái)獲取所有正在運(yùn)行的進(jìn)程的進(jìn)程 ID,就像這樣:

ps | grep cp

執(zhí)行以后會(huì)顯示出包含 cp 字符串的所有進(jìn)程,例如上面例子中的 cp 進(jìn)程。同時(shí)還會(huì)顯示出對(duì)應(yīng)的進(jìn)程 ID:

$ ps | grep cp 14444 pts/3 00:00:13 cp

在這個(gè)例子中,進(jìn)程 ID 是 14444,因此可以使用以下命令來(lái)暫停這個(gè)后臺(tái)進(jìn)程:

kill -s STOP 14444

注意,這里的 STOP 等同于前面提到的 ctrl+z 組合鍵的效果,也就是僅僅把進(jìn)程暫停掉。

如果想要把暫停了的進(jìn)程啟動(dòng)起來(lái),可以對(duì)進(jìn)程發(fā)出 CONT 信號(hào):

kill -s CONT 14444

這個(gè)給出一個(gè)可以向進(jìn)程發(fā)出的常用信號(hào)[6]列表。如果想要終止一個(gè)進(jìn)程,可以發(fā)送 TERM 信號(hào):

kill -s TERM 14444

如果進(jìn)程不響應(yīng) TERM 信號(hào)并拒絕退出,還可以發(fā)送 KILL 信號(hào)強(qiáng)制終止進(jìn)程:

kill -s KILL 14444

強(qiáng)制終止進(jìn)程可能會(huì)有一定的風(fēng)險(xiǎn),但如果遇到進(jìn)程無(wú)節(jié)制消耗資源的情況,這樣的信號(hào)還是能夠派上用場(chǎng)的。

另外,如果你不確定進(jìn)程 ID 是否正確,可以在 ps 命令中加上 x 參數(shù):

$ ps x| grep cp 14444 pts/3 D 0:14 cp -i -R original/dir/Hols_2014.mp4   original/dir/Hols_2015.mp4 original/dir/Hols_2016.mp4   original/dir/Hols_2017.mp4 original/dir/Hols_2018.mp4 backup/dir/

這樣就可以看到是不是你需要的進(jìn)程 ID 了。

***介紹一個(gè)將 ps 和 grep 結(jié)合到一起的命令:

$ pgrep cp 8 18 19 26 33 40 47 54 61 72 88 96 136 339 6680 13735 14444

pgrep 可以直接將帶有字符串 cp 的進(jìn)程的進(jìn)程 ID 顯示出來(lái)。

可以加上一些參數(shù)讓它的輸出更清晰:

$ pgrep -lx cp 14444 cp

在這里,-l 參數(shù)會(huì)讓 pgrep 將進(jìn)程的名稱顯示出來(lái),-x 參數(shù)則是讓 pgrep 完全匹配 cp  這個(gè)命令。如果還想了解這個(gè)命令的更多細(xì)節(jié),可以嘗試運(yùn)行 pgrep -ax。

總結(jié)

在命令的末尾加上 & 可以讓我們理解前臺(tái)進(jìn)程和后臺(tái)進(jìn)程的概念,以及如何管理這些進(jìn)程。

在 UNIX/Linux 術(shù)語(yǔ)中,在后臺(tái)運(yùn)行的進(jìn)程被稱為守護(hù)進(jìn)程daemon。如果你曾經(jīng)聽(tīng)說(shuō)過(guò)這個(gè)詞,那你現(xiàn)在應(yīng)該知道它的意義了。

和其它符號(hào)一樣,& 在命令行中還有很多別的用法。

到此,相信大家對(duì)“Linux中的&是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI