2014-09-10 63 views
1

我需要從遠處的服務器獲取列表中指定的一組文件。我使用了Matlab腳本(在Centos6機器上):wget from matlab腳本 - 卡住的線程

for k=1:length(u_list) 
    o_name = fullfile(outFolder, names{k}); 
    i_name = u_list{k}.url; 
    [status, result] = unix(['wget -O ' o_name ' ' i_name]); 
end 

這不起作用。 我得到很多的wget進程陷入

ps aux |grep wget 

顯示了很多wget的情況下的堅持,以及一些文件不通過。在我看來,麻煩在於matlab沒有等待'system'調用返回。 有什麼建議嗎?

編輯:這個網址有一個excape字符'&'。 正在操作: unix(['wget -O'o_name'--timeout = 100''i_name''''));

沒有辦法。

+1

這真的很奇怪 - 手冊中明確指出:*在將命令的退出狀態返回到狀態變量之前,操作等待命令完成**執行。*您使用的是哪個Matlab版本以及哪個wget?難道你的名字中包含需要轉義的'&'? – bdecaf 2014-09-10 10:02:18

+0

啊,你說得對。該網址包含&。 我在i_name周圍添加了''',一切正常... – mousomer 2014-09-10 10:14:20

回答

1

這個網址有個'ex32'字符'&'。做的:

unix(['wget -O ' o_name ' --timeout=100 "' i_name '"']); 

訣竅。

0

您的wget進程是否正在等待服務器忙時的超時?從網絡獲取數據之類的事情,我認爲最好的辦法是承認這些東西需要時間,並在代碼中適當地處理。

我會繼續記錄每個wget進程的計數,然後只在所有內容完成時才進行。你可以這樣做的東西,如:

for k=1:length(u_list) 
     o_name = fullfile(outFolder, names{k}); 
     i_name = u_list{k}.url; 
     [status, result] = unix(['echo 1 >> /tmp/Wget-Queue; wget -O ' o_name ' ' i_name '--timeout=100 && sed -i ''$s/,$//'' /tmp/Wget-Queue' ]); 
    end 

這樣做是寫一個臨時文件(把它獨有的東西 - 也許是的/ tmp/$ PPID /隊列會更好 - 產卵斷的wget進程,然後刪除該文件中的最後一個字符時,wget的完成。如果該文件是空的,你知道你下載完成 - 你可以做一些簡單的像

[~,JobsRemaining]=unix('cat /tmp/Wget-Queue'); 
JobsRemaining=length(strfind(JobsRemaining,'1')); 

if JobsRemaining == 0 
    doSomethingElse(); 
end 

到後來才知道何時進行

+1

ps aux | grep wget | wc 在一個多小時內不會改變,而且Matlab創建的應用程序遠遠超過它,我真正需要的是一個鎖。 – mousomer 2014-09-10 09:27:09

+0

或者確實是pgrep wget | wc -l – Landak 2014-09-10 09:28:16

+0

_Why_不會忘記走開嗎?如果它複製數據超過了你的意思,只需寫入/ tmp中的某個內容並將其用作鎖,這實際上就是我提出的以上 – Landak 2014-09-10 09:29:53