Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 新的文件监视脚本_Linux_Bash_Shell - Fatal编程技术网

Linux 新的文件监视脚本

Linux 新的文件监视脚本,linux,bash,shell,Linux,Bash,Shell,我正在制作一个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" -ma

我正在制作一个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分钟的脚本运行中检查电子邮件新文件退出。 请建议……

您的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;
必须为文件更改变量,但已测试并工作

您应该使用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 

它需要一些调整,因为按原样,每次调用都会进入一个无限循环,但现在它只会捕获在find的两次调用之间创建的新文件。如果它是从cron这样运行的,它将需要将状态存储在某个地方,可能是一个文件。或者对find.cmh使用-mtime命令,这就是问题所在。没有cron脚本是完美的,但是如果我们想在cron中运行这个脚本,那么我们需要寻找其他的解决方案。因为一旦脚本退出,变量中就不会有以前的值。../imp.sh:第9行:意外标记附近的语法错误,然后“。/imp.sh:第9行:如果[!-f/tmp/oldmonitor.txt];然后触摸/tmp/oldmonitor.txt;fi;'在上述代码的第7行给出错误,然后触摸/tmp/oldmonitor.txt;fi;错误是意外标记“then touch/tmp/oldmonitor.txt”附近的语法错误;fi;'为什么不把睡眠时间改为15分钟?睡眠时间更改睡眠时间不会退出正在运行的进程。我希望每15分钟运行一次检查电子邮件新文件退出程序。这样做的原因是减少资源消耗鉴于您在linux上,您可以从inotify工具中检查inotifywait,这正是出于此目的。不需要定期检查-当新文件进入时,它会通知,否则就在那里等待。我不能使用inotify。只有cron和script是options@Readerlook这是家庭作业吗?为什么你有工具的限制?在上面的回答中,我得到了一切。还需要一个帮助,通过使用“%Tc\t%s\t%p\n”,我获得了文件名为的完整路径。我只需要最后一两个目录和文件名。有谁能建议我如何做到这一点吗?你知道怎么做吗