簡體   English   中英

Bash:循環遍歷文件並讀取子字符串作為參數,執行多個實例

[英]Bash: Loop through file and read substring as argument, execute multiple instances

現在怎么樣

我目前有一個在Windows下運行的腳本,該腳本經常從服務器列表中調用遞歸文件樹。

我使用AutoIt(作業管理器)腳本執行30個lftp並行實例(靜止窗口),執行以下操作:

lftp -e "find .; exit" <serveraddr>

用作作業管理器輸入的文件是純文本文件,每行的格式如下:

<serveraddr>|...

其中“ ...”是不重要的數據。 我需要運行lftp的多個實例以實現最佳性能,因為單個實例的性能取決於服務器的響應時間。

每個lftp.exe實例將其輸出傳遞到名為

<serveraddr>.txt

它需要如何

現在,我需要將整個過程移植到Linux(安裝了lftp的Ubuntu)專用服務器上。 從我以前非常有限的Linux使用經驗來看,我想這將非常簡單。

我需要寫些什么? 例如,我是否仍需要工作手冊或可以在一個腳本中完成? 如何從文件中讀取(我想這將是最簡單的部分),以及如何保持最大值。 30個實例的運行量(甚至可能超時,因為響應極慢的服務器可能會阻塞隊列)?

謝謝!

並行處理

我會使用GNU / parallel。 它不是默認分發的,但是可以從默認軟件包存儲庫安裝到大多數Linux分發中。 它是這樣的:

parallel echo ::: arg1 arg2

將並行執行echo arg1echo arg2

因此,最簡單的方法是創建一個腳本,使您的服務器在bash / perl / python中同步(無論您喜歡什么)-並按以下方式執行:

parallel ./script ::: server1 server2

該腳本可能如下所示:

#!/bin/sh
#$0 holds program name, $1 holds first argument.
#$1 will get passed from GNU/parallel. we save it to a variable.
server="$1"
lftp -e "find .; exit" "$server" >"$server-files.txt"

lftp似乎也可用於Linux,因此您無需更改FTP客戶端。

運行最大 一次30個實例,像這樣傳遞-j30parallel -j30 echo ::: 1 2 3

讀取文件列表

現在如何將包含<server>|...條目的規范文件轉換為GNU / parallel參數? 簡單-首先,過濾文件以僅包含主機名:

sed 's/|.*$//' server-list.txt

sed用於使用正則表達式等替換事物。 這將刪除第一個|之后的所有內容( .*| 直到行尾( $ )。 (雖然|通常在sed中表示正則表達式中的替代運算符,但需要對其進行轉義以使其那樣工作,否則它僅表示普通| 。)

所以現在您有了服務器列表。 如何將它們傳遞給您的腳本? xargs xargs將把每一行都當作可執行文件的附加參數。 例如

echo -e "1\n2"|xargs echo fixed_argument

會跑

echo fixed_argument 1 2

所以你應該做

sed 's/|.*$//' server-list.txt | xargs parallel -j30 ./script :::

注意事項

確保不要在每個並行任務中將結果保存到同一文件中,否則文件將損壞-coreutils很簡單,除非您自己實現,否則不要實現任何鎖定機制。 這就是為什么我將輸出重定向到$server-files.txt而不是files.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM