![](/img/trans.png)
[英]BASH - Read in config file with multiple instances of the same “variable”
[英]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 arg1
和echo 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個實例,像這樣傳遞-j30
: parallel -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.