2012-12-08 31 views
1

我有一個包含數千個文件的目錄,每個文件都必須被處理(通過python腳本)並隨後刪除。多個進程讀取和刪除同一個目錄中的文件

我想寫一個bash腳本來讀取文件夾中的文件,處理它,刪除它並移動到另一個文件 - 順序並不重要。這個bash腳本將有n個正在運行的實例(例如10個),所有這些實例都在相同的目錄上運行。當目錄中沒有更多文件時,他們退出。

我認爲這會造成競爭條件。你能給我一個建議(或代碼片段)如何確保沒有兩個bash腳本在同一個文件上操作?或者你認爲我應該在Python中實現多線程(而不是運行n個不同的bash腳本)?

回答

1

您可以使用文件重命名(在同一文件系統上)在Unix系統上是原子的事實,即文件被重命名或不重命名。爲了清楚起見,讓我們假設您需要處理的所有文件的名稱都以A開頭(您可以通過爲您正在處理的文件創建一些單獨的文件夾來避免此情況)。

然後,你的bash腳本迭代文件,嘗試重新命名它們,如果成功則調用python腳本(我稱之爲process),否則就繼續。就像這樣:

#!/bin/bash 

for file in A*; do 
    pfile=processing.$file 
    if mv "$file" "$pfile"; then 
     process "$pfile" 
     rm "$pfile" 
    fi 
done 

該段代碼使用了mv返回0退出代碼,如果它能夠移動的文件和其他非零退出代碼的事實。

1

沒有兩個腳本同時作用於同一文件的唯一可行方式是採用某種文件鎖定機制。一個簡單的方法是在開始工作之前重新命名文件,方法是將一些已知字符串附加到文件名中。工作完成後,文件被刪除。每個腳本在做任何事之前都會測試文件名,如果它是「特殊」的話,就會繼續前進。

更復雜的方法是維護一個臨時文件,其中包含「進行中」文件的名稱。一旦一切完成,這個文件顯然需要被刪除。

相關問題