Centos7
當兩個文件到達 Centos 7 中的不同目錄時觸發命令
當存在來自不同來源的兩個文件時,我需要啟動一個命令。每個文件都可能在不同的時間到達,但我想在收到兩者時觸發命令。我試圖用 incrond 來做,同時查看 IN_CLOSE_WRITE 和 IN_MOVED_TO 的兩個目錄
/dir/path1 IN_CLOSE_WRITE,IN_MOVED_TO command /dir/path2 IN_CLOSE_WRITE,IN_MOVED_TO command
問題是:當第一個手錶被觸發時,如何等待第二個?
例如:
時間:12:05 UTC - File1 到達 Path1 命令正在等待 Path2 監視
時間:12:09 UTC - File2 到達 Path2 命令啟動
該命令是用 Go 編碼的,但我找不到任何對我有幫助的東西。
更具體地說,該系統的工作原理如下: 有兩個遠端伺服器在 pcap 中記錄數據,時間為 6 小時,時間相同。它們記錄相同的資訊,但來自不同的 VLAN。錄製完成後,將它們上傳到主伺服器的兩個不同目錄。兩個錄音都需要上傳才能比較和混合它們,丟棄重複的數據包。錄音並不總是以相同的順序上傳,也不會同時到達。這取決於遠端伺服器和主伺服器之間的通信。
文件名總是相同的模式:_yyyymmddTHHMMSS.pcap。例如,文件開始記錄 2020-10-15 18:01:00:
文件1:vlan1_20201015T180100.pcap
文件2:vlan2_20201015T180100.pcap
我正在尋找與 incrond 和 bash 相關的解決方案或 Go 中命令中的解決方案。一個解決方案或一個線索,因為我目前處於停滯狀態。
我會創建一個由 incrond 呼叫的包裝腳本,例如
if [ -f /dir/path1 -a -f /dir/path2 ]; then command else echo "both files don't exist yet" fi
這將在每次文件觸發 IN_CLOSE_WRITE 或 IN_MOVED_TO 時執行,但僅在兩個文件都存在時執行。
更新
根據評論,似乎有必要跟踪上傳文件的完成狀態。(下面我沒測試) 構想是記錄上傳文件的完成情況,和
#!/bin/bash # $@ set to event filename by incrond filepath=$@ # this assumes both files are in the same directory, otherwise you would # have to do some logic which switches directories as well as filename # check file matches pattern if [[ "${filepath}" =~ vlan.*\.pcap$ ]]; then # mark current file as completed if [ ! -f "${filepath}.complete" ]; then touch "${filepath}.complete" fi filename=$(basename ${filepath}) dirname=$(dirname ${filepath}) # find other filename by toggling vlan number vlan_num=${filename:4:1} [[ "${vlan_num}" == "1" ]] && vlan_alt=2 || vlan_alt=1 # construct the other filename other_file=${dirname}$/{filename:0:4}${vlan_alt}${filename:5} echo $other_file; # see if other filename completion file exists if [ -f "${other_file}.complete" ]; then command else # other file not uploaded yet echo "completion file for both files not exists" fi else echo "file didn't match pattern" fi