AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1038863
Accepted
Jose Ángel de Pascual Viciana
Jose Ángel de Pascual Viciana
Asked: 2020-10-16 08:59:23 +0800 CST2020-10-16 08:59:23 +0800 CST 2020-10-16 08:59:23 +0800 CST

当两个文件到达 Centos 7 中的不同目录时触发命令

  • 772

当存在来自不同来源的两个文件时,我需要启动一个命令。每个文件都可能在不同的时间到达,但我想在收到两者时触发命令。我试图用 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 中命令中的解决方案。一个解决方案或一个线索,因为我目前处于停滞状态。

files inotify centos7 incrontab incrond
  • 2 2 个回答
  • 98 Views

2 个回答

  • Voted
  1. Best Answer
    Tom
    2020-10-16T09:24:34+08:002020-10-16T09:24:34+08:00

    我会创建一个由 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
    
    • 1
  2. Jose Ángel de Pascual Viciana
    2020-10-20T03:47:07+08:002020-10-20T03:47:07+08:00

    使用 lsof 的另一种解决方法。此解决方案必须以 root 身份运行。

    根 incrontab

    /path/to/vlan1  IN_CLOSE_WRITE,IN_MOVED_TO  /usr/local/bin/monitor.sh $@/$# /path/to/vlan2
    /path/to/vlan2  IN_CLOSE_WRITE,IN_MOVED_TO   /usr/local/bin/monitor.sh $@/$# /path/to/vlan1
    

    包装脚本

    #!/bin/bash
    # monitor.sh
    FILE_FINISHED=$1
    FIND_PATH=$2
    
    f=`basename $FILE_FINISHED`
    
    FILE2=`ls $FIND_PATH/*${f:11:13}*`
    STATUS=$?
    if [ $STATUS -eq 0  ]
    then
        lsof $FILE2 > /dev/null 2>&1
        STATUS=$?
        if [ $STATUS -ne 0 ]
        then
            echo "Command"
        else
            echo "Still uploading"
        fi
    else
        echo "File not exist"
    fi
    
    • 0

相关问题

  • 在本地复制大型目录树?cp还是rsync?

  • > 4GB文件的rsync

  • 操作系统文件

  • 比较(diff)完整目录结构的最佳方法?

  • 将 .mbx 文件转换为 .pst 文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve