並行處理 Linux 命令


並行處理命令可以簡化在 Linux 中執行多個命令時的工作。作為 Linux 管理員,您可以並行處理多個命令來執行各種任務,例如重新啟動服務、安裝系統補丁和安裝應用程式。

在命令列中組合兩個或多個命令稱為命令連結。您可以使用命令連結來並行執行多個命令。

您可以輕鬆地一次連結不同的命令來簡化流程。因此,在本篇指南中,我們將解釋您可以嘗試的所有並行處理 Linux 命令的流程。

並行處理 Linux 命令

在 Linux 中,您可以使用多個運算子和命令並行執行多個命令。現在我們將瞭解如何在多種條件下透過不同的運算子並行執行多個命令。

使用 & 運算子

在 Linux 中,您可以在一個命令之後使用“&”符號同時執行多個命令。使用此內建的 bash 與號或運算子會導致 shell 執行下一個命令而不等待當前正在執行的命令完成,並且命令將並行執行。

:~$ command1 & command2…

例如,我們使用 & 運算子一起執行 ls 和 cat 命令。

:~$ ls & cat Linux.txt
[1] 6178
Don't erase the existing data. 
Desktop    file.sh      Myfile     prateek.pcap       Templates

您可以看到同時執行以上兩個命令會顯示輸出。cat 命令顯示“Linux.txt”檔案的內容,而 ls 命令顯示當前目錄中的所有檔案。

使用 wait 和 & (& :)

您可以使用 wait (:) 和 & 運算子同時執行多個命令。“&”運算子的工作方式類似,但“wait (:)”會停止所有後臺任務,直到它們完成,然後才將控制權返回給 shell。使用這種方法,您可以執行批處理操作,其語法如下所示:

:~$ command1 & : command2
.
.
.
command3

為了更好地理解這種方法,讓我們使用 & 運算子一起執行 bash 檔案和 ls 命令。當這些命令向後執行時,我們透過執行 uptime 命令顯示當前時間的資訊。

:~$ ./file.sh & : ls
[1] 3650
:~$  Desktop    file.sh     Myfile    prateek.pcap      Templates 
  Documents 
uptime
19:06:59 up 1 min, 1 user, load average: 1.31, 0.55, 0.20
[1]+ Done            ./file.sh

此方法的缺點之一是,您只能在所有批處理過程完成後才能啟動新程序。為了解決這個問題,您可以使用 xargs 命令。

使用 Xargs

Linux 中的 xargs 命令指定您想要同時執行的程序數。您可以使用 xargs 命令並行執行 Linux 中的多個輸入引數。在這裡,我們將以下 xargs 命令與 ls 命令連線起來,以便它在 ls 輸出的每個檔案上並行使用 3 個程序。

:~$ ls | xargs -P 3 -n 2
Desktop Documents
Downloads example.txt
File.sh Linux.txt
Pictures Points
Prateek.pcap Public
Snap source.sh
Templates

一旦前一個程序完成,Xargs 就會啟動另一個程序。在上面的示例中,我們使用 -P 和 -n 引數指定了並行任務的數量,以呼叫每次呼叫的引數數量。

使用分號 (;) 運算子

透過分號 (;) 運算子,您可以連續執行各種命令,無論您之前的命令是否成功。

:~$ command 1; command2;.....

在這裡,我們將執行 pwd、ls 和 uptime 這三個命令,在終端中用分號 (;) 分隔它們,如下所示:

:~$ pwd; ls; uptime
/home/prateek
Desktop    file.sh     Myfile    prateek.pcap      Templates 
Documents 
12:36:51 up 1 min, 1 user, load average: 3.14, 1.09, 0.39

[pwd] 查詢您的當前目錄,[ls] 顯示當前目錄的列表,[uptime] 提供與時間相關的資訊,例如當前時間、負載平均值、線上使用者數量等。在終端中一起執行這三個命令將立即告訴您所有上述資訊。請記住,命令和分號之間不應該有任何空格。

使用 | (管道) 運算子

您可以使用管道運算子並行執行多個命令。透過此運算子,您可以順序組合並執行兩個或多個命令。

:~$ command 1 | command 2 | command 3….

例如,在這裡我們將首先讀取名為“Linux1.txt”的文字檔案的內容,然後在第二個命令中搜索其中名為“erasing”的關鍵字。

:~$ cat Linux.txt | grep erasing
Don't erase the existing data.

在這裡,我們使用 cat 命令顯示了“Linux.txt”檔案的內容。透過 grep 命令,我們從該檔案中搜索了關鍵字“erasing”,並用紅色突出顯示。

使用 GNU Parallel

GNU 是 Linux 中的一個命令列工具,您可以使用它在遠端伺服器或本地機器上並行執行 Linux 命令。它允許您同時執行多個命令例項,這些例項從標準輸入或檔案輸入中獲取輸入。

此工具未預安裝在 Linux 發行版中,但在儲存庫中。因此,您可以透過以下命令安裝它:

sudo apt install parallel -y (for Debian/Ubuntu-based distros)
yum install parallel (for RedHat-based distros)

使用 Bash 指令碼

透過 bash 指令碼,您可以並行執行多個命令。但是,您必須首先建立一個 bash 檔案。您可以在此 bash 檔案中輸入要執行的所有命令。之後,您只需執行該 bash 指令碼,然後您將獲得所有命令的結果。

讓我們透過以下命令建立一個名為“file.sh”的 bash 檔案,並在其中輸入所有命令:

:~$ nano file.sh
#! /bin/bash 
touch myfile.txt
echo "tutorials Point" > myfile.txt
ls && cat myfile.txt
  • 在此指令碼中,我們首先使用 touch 命令建立了一個名為“myfile”的檔案。

  • 之後,使用 echo 命令在此檔案中輸入文字“Tutorials Point”。

  • 最後,使用 ls 命令查詢當前目錄,然後使用 cat 命令檢視檔案“myfile”的內容。

按 Ctrl+O 儲存此檔案,然後按 Ctrl+X 退出。此外,我們可以透過以下 chmod 命令使該檔案可執行:

:~$ chmod +x file.sh

讓我們執行上面建立的 bash 檔案,以便我們輸入的任何命令都將並行執行並顯示輸出。

:~$ ./file.sh
Desktop    file.sh     Myfile    prateek.pcap      Templates 
Documents 
Tutorials Point

從上面的輸出中,系統已執行指令碼中提到的所有命令。

使用 && (AND) 運算子

您可以使用“&&”運算子分隔多個命令並依次執行它們。在此運算子中,系統將在第一個命令成功執行後執行第二個命令。

:~$ command 1 && command 2…

例如,如果我們必須建立一個名為“MyFile”的目錄,然後更改到該目錄,我們可以透過“&&”運算子成功執行這兩個過程。

:~$ mkdir MyFile && cd MyFile
:~/MyFile$

您可以看到上面的命令已成功執行,首先建立了您的目錄,然後您進入了該目錄。

使用 (||) 運算子

在某些情況下,當您一起執行兩個或多個命令時,您希望在第一個命令失敗或出現錯誤時執行以下命令。您可以使用兩個豎線 (||) 或邏輯或運算子。

“OR”運算子僅在第一個命令失敗時才會執行以下命令。如果第一個命令成功執行,則不會執行下一個命令。

:~$ command 1 || command 2…

讓我們檢查系統中是否包含“Myfile”目錄;如果不可用,則系統必須建立它。我們將使用以下命令使用邏輯“OR”運算子:

:~$ [ -d ~/Myfile ] || mkdir ~/Myfile

在此示例中,第一個命令 [ -d ~/Myfile ] 失敗,因為沒有名為“Myfile”的目錄,因此係統的第二個命令 [mkdir ~/Myfile] 執行以建立 MyFile 目錄。

組合多個運算子

您可以根據您的需要組合上述運算子並同時執行它們。讓我們在這裡組合 AND (&&) 和 OR (||) 運算子。例如,我們將檢查系統中是否存在“myfile.txt”檔案,但如果不存在,系統將建立它,否則列印訊息“檔案已存在”:

:~$ [ -f ~/myfile.txt ] && echo "File exists." || touch ~/myfile.txt
File exists

您可以看到該檔案已在檔案系統中,因此它列印“檔案已存在”。

結論

當您想要同時執行許多命令時,命令連結非常有用。在本文中,我們解釋了使用多個命令和運算子並行處理 Linux 命令的各種方法。本教程包含幾乎所有可能的方法,例如 (&) (||)、(;)、(|)、運算子、bash 方法、GNU parallel 方法,以及許多其他命令和運算子的使用。

更新於:2023年5月18日

12K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告