Centos7

當兩個文件到達 Centos 7 中的不同目錄時觸發命令

  • October 19, 2020

當存在來自不同來源的兩個文件時,我需要啟動一個命令。每個文件都可能在不同的時間到達,但我想在收到兩者時觸發命令。我試圖用 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

引用自:https://serverfault.com/questions/1038863