& 號和管道符號(|)在不同場景下的使用方法
掌握連線各個命令之間的連線符號用法也是很重要的。實際上,命令的用法並不難,例如 mkdir、touch和 find 也分別可以簡單概括為“建立新目錄”、“更新檔案”和“在目錄樹中查詢檔案”而已。
但如果要理解
mkdir test_dir 2>/dev/null || touch images.txt && find . -iname "*jpg" > backup/dir/images.txt &
這一串命令的目的,以及為什麼要這樣寫,就沒有這麼簡單了。
關鍵之處就在於命令之間的連線符號。掌握了這些符號的用法,不僅可以讓你更好理解整體的工作原理,還可以讓你知道如何將不同的命令有效地結合起來,提高工作效率。
在這一篇文章和接下來的文章中,我會介紹如何使用 & 號和管道符號(|)在不同場景下的使用方法。
我來舉一個簡單的例子,看看如何使用 & 號將下面這個命令放到後臺執行:
cp -R original/dir/ backup/dir/
這個命令的目的是將 original/dir/ 的內容遞迴地複製到 backup/dir/ 中。雖然看起來很簡單,但是如果原目錄裡面的檔案太大,在執行過程中終端就會一直被卡住。
所以,可以在命令的末尾加上一個 & 號,將這個任務放到後臺去執行:
cp -R original/dir/ backup/dir/ &
任務被放到後臺執行之後,就可以立即繼續在同一個終端上工作了,甚至關閉終端也不影響這個任務的正常執行。需要注意的是,如果要求這個任務輸出內容到標準輸出中(例如 echo 或 ls),即使使用了 &,也會等待這些輸出任務在前臺執行完畢。
當使用 & 將一個程式放置到後臺執行的時候,Bash 會提示這個程式的程式 ID。在 系統中執行的每一個程式都有一個唯一的程式 ID,你可以使用程式 ID 來暫停、恢復或者終止對應的程式,因此程式 ID 是非常重要的。
這個時候,只要你還停留在啟動程式的終端當中,就可以使用以下幾個命令來對管理後臺程式:
jobs 命令可以顯示當前終端正在執行的程式,包括前臺執行和後臺執行的程式。它對每個正在執行中的程式任務分配了一個序號(這個序號不是程式 ID),可以使用這些序號來引用各個程式任務。
$ jobs[1]- Running cp -i -R original/dir/* backup/dir/ &[2]+ Running find . -iname "*jpg" > backup/dir/images.txt &
fg 命令可以將後臺執行的程式任務放到前臺執行,這樣可以比較方便地進行互動。根據 jobs 命令提供的程式任務序號,再在前面加上 % 符號,就可以把相應的程式任務放到前臺執行。
$ fg %1 # 將上面序號為 1 的 cp 任務放到前臺執行 cp -i -R original/dir/* backup/dir/
如果這個程式任務是暫停狀態,fg 命令會將它啟動起來。
使用 ctrl+z 組合鍵可以將前臺執行的任務暫停,僅僅是暫停,而不是將任務終止。當使用 fg 或者 bg 命令將任務重新啟動起來的時候,任務會從被暫停的位置開始執行。但 sleep 命令是一個特例,sleep 任務被暫停的時間會計算在 sleep 時間之內。因為 sleep 命令依據的是系統時鐘的時間,而不是實際執行的時間。也就是說,如果執行了 sleep 30,然後將任務暫停 30 秒以上,那麼任務恢復執行的時候會立即終止並退出。
bg 命令會將任務放置到後臺執行,如果任務是暫停狀態,也會被啟動起來。
$ bg %1 [1]+ cp -i -R original/dir/* backup/dir/ &
如上所述,以上幾個命令只能在同一個終端裡才能使用。如果啟動程式任務的終端被關閉了,或者切換到了另一個終端,以上幾個命令就無法使用了。
如果要在另一個終端管理後臺程式,就需要其它工具了。例如可以使用 kill 命令從另一個終端終止某個程式:
kill -s STOP <PID>
這裡的 PID 就是使用 & 將程式放到後臺時 Bash 顯示的那個程式 ID。如果你當時沒有把程式 ID 記錄下來,也可以使用 ps 命令(代表 process)來獲取所有正在執行的程式的程式 ID,就像這樣:
ps | grep cp
執行以後會顯示出包含 cp 字串的所有程式,例如上面例子中的 cp 程式。同時還會顯示出對應的程式 ID:
$ ps | grep cp 14444 pts/3 00:00:13 cp
在這個例子中,程式 ID 是 14444,因此可以使用以下命令來暫停這個後臺程式:
kill -s STOP 14444 注意,這裡的 STOP 等同於前面提到的 ctrl+z 組合鍵的效果,也就是僅僅把程式暫停掉。
如果想要把暫停了的程式啟動起來,可以對程式發出 CONT 訊號:
kill -s CONT 14444 這個給出一個可以向程式發出的常用訊號列表。如果想要終止一個程式,可以傳送 TERM 訊號:
kill -s TERM 14444 如果程式不響應 TERM 訊號並拒絕退出,還可以傳送 KILL 訊號強制終止程式:
kill -s KILL 14444 強制終止程式可能會有一定的風險,但如果遇到程式無節制消耗資源的情況,這樣的訊號還是能夠派上用場的。
另外,如果你不確定程式 ID 是否正確,可以在 ps 命令中加上 x 引數:
$ 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/
這樣就可以看到是不是你需要的程式 ID 了。
最後介紹一個將 ps 和 grep 結合到一起的命令:
$ pgrep cp 8 18 19 26 33 40 47 54 61 72 88 96 136 339 6680 13735 14444
pgrep 可以直接將帶有字串 cp 的程式的程式 ID 顯示出來。
可以加上一些引數讓它的輸出更清晰:
$ pgrep -lx cp 14444 cp
在這裡,-l 引數會讓 pgrep 將程式的名稱顯示出來,-x 引數則是讓 pgrep 完全匹配 cp 這個命令。如果還想了解這個命令的更多細節,可以嘗試執行 pgrep -ax。
在命令的末尾加上 & 可以讓我們理解前臺程式和後臺程式的概念,以及如何管理這些程式。
在 UNIX/Linux 術語中,在後臺執行的程式被稱為守護程式daemon。如果你曾經聽說過這個詞,那你現在應該知道它的意義了。
和其它符號一樣,& 在命令列中還有很多別的用法。在下一篇文章中,我會更詳細地介紹。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2638454/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ASEMI的MOS管25N120在不同應用場景的表現
- 解鎖「SOAR」在不同場景下的應用與實踐
- Linux中單引號和雙引號的使用方法及注意事項!Linux
- 直播影片美顏SDK在不同場景下的表現效果分析
- R語言中管道符號 %>% 的應用 及 舉例R語言符號
- [原]不同場景下MySQL的遷移方案MySql
- 批號管理常見的業務應用場景
- [ Git ] 不同場景下如何使用「撤銷」操作Git
- 【Insights直播】華為帳號服務,打造全場景安全帳號體系
- SAP HUM巢狀HU場景下WM報表LS26裡SU號碼是外層HU號碼巢狀
- 電話機器人在不同的行業有不同的應用場景和不同的效果機器人行業
- 互斥鎖和訊號量有什麼不同?(譯)
- Insights直播回顧| 華為帳號服務,打造全場景安全帳號體系
- iKcamp&掘金Podcast直播回顧(12月2號和9號的兩場)AST
- 報表工具中動態引數的使用方法和場景
- JS 中 this 在各個場景下的指向JS
- SACC 2018十年沉澱之人工智慧篇:AI在不同企業場景下的應用和探索人工智慧AI
- 微信公眾號託管
- 數字裡的點號和分號
- RocketMQ 在多 IDC 場景以及多隔離區場景下的實踐MQ
- PPR管(聚丙烯管)在給水、暖通空調、冷水管道以及一些工業用途上具有廣泛應用。PPR管的不同型號(S6.3、S5、S4、S3.2、S2.5、S2)通常是指不同的壁厚等級,每種型號的管道適用於不同的壓力和用途。S3
- 探索新時代AI助手:ChatGPT的潛在應用場景及在蘋果和安卓裝置上的使用方法AIChatGPT蘋果安卓
- 理解正規表示式中的括號 (),方括號 [] 和大括號 {}
- latex 屬於符號和根號符號
- 一臺電腦配置兩個Git賬號(github和gitlab),不同倉庫使用不同的gitGithubGitlab
- StringBuilder在高效能場景下的正確用法UI
- TiDB 在咪咕雲原生場景下的實踐TiDB
- Sermant在異地多活場景下的實踐
- firefox和IE在一個逗號上的差別Firefox
- Redis 中 set 和 hset 有什麼不同,各自使用場景Redis
- Linux 下的程式間通訊:套接字和訊號Linux
- Oracle中單引號和雙引號的區別Oracle
- 京東張政:內容理解在廣告場景下的實踐和探索
- 在一臺Mac上不同平臺同時使用多個Git賬號MacGit
- git分支管理和工作流規範:不同場景細化和演示Git
- 安全容器在邊緣計算場景下的實踐
- Service Mesh 在超大規模場景下的落地挑戰
- MySQL樂觀鎖在分散式場景下的實踐MySql分散式