号和管道符号(|)在不同场景下的使用方法
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
掌握連接各個命令之間的連接符號用法也是很重要的。實際上,命令的用法并不難,例如 mkdir、touch和 find 也分別可以簡單概括為“建立新目錄”、“更新文件”和“在目錄樹中查找文件”而已。
但如果要理解
mkdir test_dir 2>/dev/null || touch images.txt && find . -iname "*jpg" > backup/dir/images.txt &這一串命令的目的,以及為什么要這樣寫,就沒有這么簡單了。
關(guān)鍵之處就在于命令之間的連接符號。掌握了這些符號的用法,不僅可以讓你更好理解整體的工作原理,還可以讓你知道如何將不同的命令有效地結(jié)合起來,提高工作效率。
在這一篇文章和接下來的文章中,我會介紹如何使用 & 號和管道符號(|)在不同場景下的使用方法。
幕后工作
我來舉一個簡單的例子,看看如何使用 & 號將下面這個命令放到后臺運行:
cp -R original/dir/ backup/dir/這個命令的目的是將 original/dir/?的內(nèi)容遞歸地復(fù)制到 backup/dir/?中。雖然看起來很簡單,但是如果原目錄里面的文件太大,在執(zhí)行過程中終端就會一直被卡住。
所以,可以在命令的末尾加上一個 &?號,將這個任務(wù)放到后臺去執(zhí)行:
cp -R original/dir/ backup/dir/ &任務(wù)被放到后臺執(zhí)行之后,就可以立即繼續(xù)在同一個終端上工作了,甚至關(guān)閉終端也不影響這個任務(wù)的正常執(zhí)行。需要注意的是,如果要求這個任務(wù)輸出內(nèi)容到標(biāo)準(zhǔn)輸出中(例如 echo 或 ls),即使使用了 &,也會等待這些輸出任務(wù)在前臺運行完畢。
當(dāng)使用 & 將一個進(jìn)程放置到后臺運行的時候,Bash 會提示這個進(jìn)程的進(jìn)程 ID。在?Linux?系統(tǒng)中運行的每一個進(jìn)程都有一個唯一的進(jìn)程 ID,你可以使用進(jìn)程 ID 來暫停、恢復(fù)或者終止對應(yīng)的進(jìn)程,因此進(jìn)程 ID 是非常重要的。
這個時候,只要你還停留在啟動進(jìn)程的終端當(dāng)中,就可以使用以下幾個命令來對管理后臺進(jìn)程:
jobs?命令可以顯示當(dāng)前終端正在運行的進(jìn)程,包括前臺運行和后臺運行的進(jìn)程。它對每個正在執(zhí)行中的進(jìn)程任務(wù)分配了一個序號(這個序號不是進(jìn)程 ID),可以使用這些序號來引用各個進(jìn)程任務(wù)。
$ jobs[1]- Running cp -i -R original/dir/* backup/dir/ &[2]+ Running find . -iname "*jpg" > backup/dir/images.txt &fg?命令可以將后臺運行的進(jìn)程任務(wù)放到前臺運行,這樣可以比較方便地進(jìn)行交互。根據(jù) jobs?命令提供的進(jìn)程任務(wù)序號,再在前面加上 % 符號,就可以把相應(yīng)的進(jìn)程任務(wù)放到前臺運行。
$ fg %1 # 將上面序號為 1 的 cp 任務(wù)放到前臺運行 cp -i -R original/dir/* backup/dir/如果這個進(jìn)程任務(wù)是暫停狀態(tài),fg 命令會將它啟動起來。
使用 ctrl+z 組合鍵可以將前臺運行的任務(wù)暫停,僅僅是暫停,而不是將任務(wù)終止。當(dāng)使用 fg 或者 bg 命令將任務(wù)重新啟動起來的時候,任務(wù)會從被暫停的位置開始執(zhí)行。但 sleep 命令是一個特例,sleep 任務(wù)被暫停的時間會計算在 sleep 時間之內(nèi)。因為 sleep 命令依據(jù)的是系統(tǒng)時鐘的時間,而不是實際運行的時間。也就是說,如果運行了 sleep 30,然后將任務(wù)暫停 30 秒以上,那么任務(wù)恢復(fù)執(zhí)行的時候會立即終止并退出。
bg 命令會將任務(wù)放置到后臺執(zhí)行,如果任務(wù)是暫停狀態(tài),也會被啟動起來。
如上所述,以上幾個命令只能在同一個終端里才能使用。如果啟動進(jìn)程任務(wù)的終端被關(guān)閉了,或者切換到了另一個終端,以上幾個命令就無法使用了。
如果要在另一個終端管理后臺進(jìn)程,就需要其它工具了。例如可以使用 kill 命令從另一個終端終止某個進(jìn)程:
kill -s STOP <PID>這里的 PID 就是使用 & 將進(jìn)程放到后臺時 Bash 顯示的那個進(jìn)程 ID。如果你當(dāng)時沒有把進(jìn)程 ID 記錄下來,也可以使用 ps 命令(代表 process)來獲取所有正在運行的進(jìn)程的進(jìn)程 ID,就像這樣:
ps | grep cp執(zhí)行以后會顯示出包含 cp 字符串的所有進(jìn)程,例如上面例子中的 cp 進(jìn)程。同時還會顯示出對應(yīng)的進(jìn)程 ID:
$ ps | grep cp 14444 pts/3 00:00:13 cp在這個例子中,進(jìn)程 ID 是 14444,因此可以使用以下命令來暫停這個后臺進(jìn)程:
kill -s STOP 14444 注意,這里的 STOP 等同于前面提到的 ctrl+z 組合鍵的效果,也就是僅僅把進(jìn)程暫停掉。如果想要把暫停了的進(jìn)程啟動起來,可以對進(jìn)程發(fā)出 CONT 信號:
kill -s CONT 14444 這個給出一個可以向進(jìn)程發(fā)出的常用信號列表。如果想要終止一個進(jìn)程,可以發(fā)送 TERM 信號: kill -s TERM 14444 如果進(jìn)程不響應(yīng) TERM 信號并拒絕退出,還可以發(fā)送 KILL 信號強制終止進(jìn)程: kill -s KILL 14444 強制終止進(jìn)程可能會有一定的風(fēng)險,但如果遇到進(jìn)程無節(jié)制消耗資源的情況,這樣的信號還是能夠派上用場的。另外,如果你不確定進(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 了。
最后介紹一個將 ps 和 grep 結(jié)合到一起的命令:
$ pgrep cp 8 18 19 26 33 40 47 54 61 72 88 96 136 339 6680 13735 14444pgrep 可以直接將帶有字符串 cp 的進(jìn)程的進(jìn)程 ID 顯示出來。
可以加上一些參數(shù)讓它的輸出更清晰:
$ pgrep -lx cp 14444 cp在這里,-l 參數(shù)會讓 pgrep 將進(jìn)程的名稱顯示出來,-x 參數(shù)則是讓 pgrep 完全匹配 cp 這個命令。如果還想了解這個命令的更多細(xì)節(jié),可以嘗試運行 pgrep -ax。
總結(jié)
在命令的末尾加上 & 可以讓我們理解前臺進(jìn)程和后臺進(jìn)程的概念,以及如何管理這些進(jìn)程。
在 UNIX/Linux 術(shù)語中,在后臺運行的進(jìn)程被稱為守護(hù)進(jìn)程daemon。如果你曾經(jīng)聽說過這個詞,那你現(xiàn)在應(yīng)該知道它的意義了。
和其它符號一樣,& 在命令行中還有很多別的用法。在下一篇文章中,我會更詳細(xì)地介紹。
轉(zhuǎn)載于:https://my.oschina.net/u/3585265/blog/3023047
總結(jié)
以上是生活随笔為你收集整理的号和管道符号(|)在不同场景下的使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OAuth2简易实战(四)-Github
- 下一篇: Jmeter提取响应结果中的json数据