【问题标题】:new file monitoring script新文件监控脚本
【发布时间】:2014-04-29 20:14:31
【问题描述】:

我正在制作一个 shell 脚本,它可以“在任何新文件进入特定目录时向我发送电子邮件,其中包含新文件的名称大小和时间戳”。

以下代码很好地完成了这项工作:

#!/bin/bash

monitor_dir=/path/to/dir
email=me@me.com

files=$(find "$monitor_dir" -maxdepth 1 | sort)
IFS=$'\n'

while true
do
  sleep 5s

  newfiles=$(find "$monitor_dir" -maxdepth 1 | sort)
  added=$(comm -13 <(echo "$files") <(echo "$newfiles"))

  [ "$added" != "" ] &&
    find $added -maxdepth 1 -printf '%Tc\t%s\t%p\n' |
    mail -s "incoming" "$email"

  files="$newfiles"
done

现在我想要与 cron 作业相同的功能。这样我就可以以 15 分钟的间隔和每 15 分钟的脚本运行检查电子邮件新文件退出来安排它。
请建议...

【问题讨论】:

  • 为什么不把睡眠间隔改为 15 分钟呢? sleep 900
  • 更改睡眠时间不会退出正在运行的进程。我希望每 15 分钟运行一次-检查-电子邮件新文件-退出程序。这样做的原因是减少资源消耗
  • 鉴于你在linux上,你可以从inotify-tools查看inotifywait,正是为了这个目的。不需要定期检查 - 当新文件进入时它会通知,否则就在那里等待。
  • 我无法使用 inotify。只有 cron 和 script 是选项
  • @Readerlook,这是作业吗?为什么会有工具限制?

标签: linux bash shell


【解决方案1】:

你的 cron 应该是……

*/15 * * * * /path/to/your/script

还有你的脚本……

if [ ! -f /tmp/filemonitor.lck ]; then

  touch /tmp/filemonitor.lck
  monitor_dir=/path/to/dir
  email=me@gmail.com

  if [ ! -f /tmp/oldmonitor.txt ];then touch /tmp/oldmonitor.txt; fi;

  find "$monitor_dir" -maxdepth 1 | sort > /tmp/actual_monitor.txt

  added=$(comm -13 /tmp/oldmonitor.txt /tmp/actual_monitor.txt)
  echo $added

  [ "$added" != "" ] &&
  find $added -maxdepth 1 -printf '%Tc\t%s\t%p\n' |
  mail -s "incoming" "$email"

  rm -f /tmp/oldmonitor.txt

  mv /tmp/actual_monitor.txt /tmp/oldmonitor.txt

  rm -f /tmp/filemonitor.lck

fi;

必须更改文件的变量,但经过测试并且可以正常工作!!!

【讨论】:

  • 它需要一些调整,因为每个调用都会进入一个无限循环。
  • 但是现在它只会捕获在find 的两次调用之间创建的新文件。如果它像这样从 cron 运行,它需要将状态存储在某个地方,可能是一个文件。 (或者在 find 上使用 -mtime 命令)。
  • 正是cmh,这就是问题所在。没有 cron 脚本是完美的,但如果我们想在 cron 中运行它,那么我们需要寻找其他解决方案。因为一旦脚本退出,那么变量中将没有以前的值。
  • ./imp.sh:第 9 行:意外标记附近的语法错误 then' ./imp.sh: line 9: if[ ! -f /tmp/oldmonitor.txt ];然后触摸/tmp/oldmonitor.txt;菲;'
  • 在上面代码的第 7 行给出错误(然后触摸 /tmp/oldmonitor.txt;fi;)错误是意外标记附近的语法错误 `then touch /tmp/oldmonitor.txt;菲;'
【解决方案2】:

你应该使用inotifywait

更多信息和手册页:http://linux.die.net/man/1/inotifywait

使用这个:

monitor_dir=/tmp/1123
while true
do
    d=$(inotifywait -e  create $monitor_dir --format "%f" 2>/dev/null)
    if [[ -f $d ]]
    then
        #echo "filename is: " $monitor_dir/$d
        find $monitor_dir/$d  -printf '%Tc\t%s\t%p\n'
    fi
done 

【讨论】:

  • 在上面的答案中我得到了一切。需要更多帮助,通过使用 '%Tc\t%s\t%p\n' 我得到了带有文件名的整个路径。我只想要最后一两个目录和文件名。谁能建议我如何实现这一目标
  • 你知道怎么做吗
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多