在Linux shell中,我想將文件夾視爲一大堆文件。有一些將文件放入此包的進程。恰好有一個過程,是在以下兩個狀態中的任一個:bash - 從文件夾中選取文件,進程,刪除
- 處理文檔,然後將其刪除
- 等待的文件夾中存在的任意文檔,然後對其進行處理
文件處理順序或名稱的順序無關緊要。
從bash文件夾中獲取文件的獨特過程會是什麼樣子?處理意味着以文件名作爲參數調用另一個程序。
請注意,這個獨特的過程將不會終止,直到我手動這樣做。
在Linux shell中,我想將文件夾視爲一大堆文件。有一些將文件放入此包的進程。恰好有一個過程,是在以下兩個狀態中的任一個:bash - 從文件夾中選取文件,進程,刪除
文件處理順序或名稱的順序無關緊要。
從bash文件夾中獲取文件的獨特過程會是什麼樣子?處理意味着以文件名作爲參數調用另一個程序。
請注意,這個獨特的過程將不會終止,直到我手動這樣做。
如何:
while true; do
files=($(ls));
if [[ ${#files[@]} -eq 0 || (`lsof -c write_process -- ${files[0]}`)]]; then
sleep 5;
else
process ${files[0]};
rm ${files[0]};
fi;
done
...或者這個(可能是不健康的):
while true; do
files=($(ls));
if [ ${#files[@]} -ne 0 && ! (`lsof -c write_process -- ${files[0]}`)]; then
process ${files[0]};
rm ${files[0]};
fi;
done
哪裏,正如指出的那樣,我必須確保該文件完全寫入到文件夾中。我通過檢查寫入文件的進程的lsof來做到這一點。然而,我不知道如何解決一個進程的同一程序的多個執行...
這個工程。只要確保它不總是/經常是按字母順序添加的第一個文件(否則只要write_processes正在運行,$ {files [0]}將始終/經常打開)。 –
最簡單的方法可能是在文件只是循環,「呼叫」的處理程序,並刪除文件:
for f in /path/to/folder/*; do
program_that_processes_file $f
rm $f
done
沒有與此雖然是小問題:如果程序創建的文件不會自動完成,你可以處理甚至刪除尚未完全寫入的文件。最簡單的解決方案是讓作者寫入一個臨時目錄,然後當文件全部完成時,將其移至最終的目標目錄。
只要沒有文件存在,它會不會終止?什麼意思是關閉for循環? –
@RadioControlled然後在另一個循環中有循環。或者可能使用每隔幾秒調用一次的cron腳本。或者在目錄中有文件時使用一個目錄監視程序(有幾個這樣的程序)來調用這個腳本。 –
哦,我剛剛意識到'od'正在關閉'do'...我總是用'done' –
inotify-tools將是獲取目錄更改的即時通知的理想工具。一旦您收到新文件創建的通知,您就可以處理並刪除它。
這會很複雜,因爲在我處理一個文件時可能會創建多個文件。所以我將不得不建立一堆添加的文件。這當然是可能的,但我認爲可能有一個更簡單的解決方案,因爲放入文件夾中的文件順序無關緊要。 –
請閱讀https://techarena51.com/index.php/inotify-tools-example/。他們舉例說明了如何創建一個腳本並傳遞給inotifywait(在你的情況下是'create'事件)。 – Fazlin
'inotify'將爲目錄內的每個文件創建創建通知,並且爲每個收到的通知創建通知,您可以執行任何想要的處理。據我所知,這是最乾淨的解決方案。當然會很高興被證明是錯誤的! – Fazlin
您可以使用incrond
,它代表「inotify cron daemon」。它是一個在後臺運行並監視表中指定的目錄的守護進程。 有效的配置可以用
incrontab -e
這將打開一個編輯器,你可以輸入你想觀看的目錄和動作,例如創建,
/path/to/observed/directory IN_CREATE,IN_MOVED_TO <command> [email protected]/$#
<command>
是命令或腳本如果其中一個事件(IN_CREATE,IN_MOVED_TO
)被觸發,則要執行該操作。 [email protected]/$#
是創建或移動到監視文件夾的文件的路徑,並將傳遞到<command>
。基本上,您只需開始觀看文件夾即可。
您將不得不初始化incrond一次,告訴它哪些用戶可以使用該服務。您可以允許用戶通過將其添加到incrond.allow
,例如使用incrond,
echo 'root' >> /etc/incrond.allow
echo '<username>' >> /etc/incrond.allow
通知,即root
也必須incrond.allow
。 現在,你可以通過簡單地調用
incrond
更多信息incrond
啓動守護程序:
我只能想一個解決方案有外部文件保存狀態,否則,如果你有2個進程運行在相同的文件夾中,您將處理相同的文件兩次,或在處理其他線程時將其刪除。 – Yaron
不,只有一個進程取出文件。有多個放置文件,但只有一個進程從文件夾中刪除。 –