自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux 中的 & 詳解

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

[[258591]]

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

但如果要理解

  1. 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)行:

  1. 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í)行:

  1. 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ù)。
  1. $ jobs 
  2. [1]- Running cp -i -R original/dir/* backup/dir/ & 
  3. [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)。
  1. $ bg %1 
  2. [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)程:

  1. 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,就像這樣:

  1. ps | grep cp 

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

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

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

  1. kill -s STOP 14444 

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

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

  1. kill -s CONT 14444 

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

  1. kill -s TERM 14444 

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

  1. 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ù):

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

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

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

  1. $ pgrep cp 
  2. 18 
  3. 19 
  4. 26 
  5. 33 
  6. 40 
  7. 47 
  8. 54 
  9. 61 
  10. 72 
  11. 88 
  12. 96 
  13. 136 
  14. 339 
  15. 6680 
  16. 13735 
  17. 14444 

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

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

  1. $ pgrep -lx cp 
  2. 14444 cp 

在這里,-l 參數(shù)會(huì)讓 pgrep 將進(jìn)程的名稱(chēng)顯示出來(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)程被稱(chēng)為守護(hù)進(jìn)程daemon。如果你曾經(jīng)聽(tīng)說(shuō)過(guò)這個(gè)詞,那你現(xiàn)在應(yīng)該知道它的意義了。

和其它符號(hào)一樣,& 在命令行中還有很多別的用法。在下一篇文章中,我會(huì)更詳細(xì)地介紹。

責(zé)任編輯:武曉燕 來(lái)源: Linux中國(guó)
相關(guān)推薦

2010-01-13 09:56:26

linuxifconfig

2017-01-13 15:45:05

Linuxfork函數(shù)詳解

2009-08-03 11:54:34

linux at命令linux at命令詳cron

2011-05-24 15:48:24

linux軟路由路由

2010-06-30 10:39:45

Linux SNMP

2022-05-09 08:55:58

Linuxdiff命令

2009-08-11 10:45:58

linux中du命令參linux命令行參數(shù)linux命令行

2009-08-17 08:42:48

LinuxScreen命令使用技巧

2009-08-16 19:46:16

linux中ftp命令ftp命令參數(shù)linux命令行參數(shù)

2009-12-25 15:39:54

Load averag

2009-08-16 19:43:07

linux中touchtouch命令linux命令行參數(shù)

2009-08-16 20:08:28

linux中w命令參數(shù)w命令參數(shù)linux命令行參數(shù)

2011-08-22 15:06:19

linux環(huán)境變量

2019-05-29 16:33:32

Linux虛擬系統(tǒng)

2023-12-21 13:59:41

2019-05-22 09:00:16

Linux虛擬文件系統(tǒng)

2009-12-23 10:36:48

Linux操作系統(tǒng)

2013-05-08 10:36:07

JavaScriptJS詳解JavaScrip

2009-11-26 09:02:30

Suse Linux

2009-07-15 09:15:26

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)