在shell腳本中同時執行兩個或多個指令

在shell腳本中同時執行兩個或多個指令

在 shell 腳本中並行運行命令通常非常有幫助,但我找不到方法來做到這一點。這可能嗎?如果是這樣,我將如何實現這一目標?我主要感興趣的是為fish.

當我運行需要很長時間才能完成但可以或需要同時運行以減少完成所有操作所需的時間的命令時,它非常有用。

答案1

最基本的方法是&這個另一個答案是對的。它還提倡nohupnohup重定向 stdin、stdout 和 stderr,您可能想要也可能不想要。讀nohupdisown之間的區別&並做出明智的決定。

另一種方法是parallel如果您想要並行化的命令是彼此相似你可以製作一個圖案。

該工具的基本變體(moreutils至少來自在 Debian 中)允許您限制同時執行的作業數量。GNUparallel是比較先進的。如果您想要執行的作業產生輸出,那麼以下選項將特別有用:

--group
團體輸出。每個作業的輸出都分組在一起,並且僅在命令完成時才列印。首先是 Stdout(標準輸出),然後是 stderr(標準誤差)。 […]

來源

--group預設情況下啟用,因此通常不需要明確使用它。)

--keep-order
-k
保持輸出順序與輸入順序相同。通常,作業完成後就會立即列印作業的輸出。 [...]-k只影響列印輸出的順序,而不影響作業運作的順序。

來源

有了它們,多個作業的輸出將被組織起來,這是你無法從中獲得的&。有時你可能不關心輸出但仍然關心順序;像我的這個答案其中 GNUparallel用於並行化多個curl進程並獲取每個進程的退出狀態,並保留順序。

在 Debian 中,GNUparallel位於名為parallel.作為一個單獨的可執行檔parallel可以從任何 shell 運行。

答案2

執行此操作的最佳方法是將nohup命令前面的內容與&附加到命令末尾的內容結合起來

不清楚您的核心目標是什麼,但希望有幫助!

要在 Linux 電腦上將任何命令作為後台進程運行,您應該在命令前面加上nohup並附加到&末尾。

所以最終的命令是:

nohup [your command] &

nohup意味著該命令應忽略“hang ups”,附加的“&”號&是一個 shell 命令,告訴系統將該命令作為後台程序運行。有關其用法的更多信息可以在這裡找到

當您執行這樣的命令時,該進程將運行,您將被發送回命令提示符,您可以退出終端會話,甚至可以在該終端會話期間執行與該命令無關的其他操作。

相關內容