linux - 添加文件时运行 shell 命令

标签 linux bash shell cron

我的 linux 机器上有一个名为 images 的文件夹。 此文件夹连接到一个网站,该网站的管理员可以向该网站添加图片。但是,当添加图片时,我想要一个命令来运行调整目录中所有图片的大小。

简而言之,我想知道如何让服务器在将新文件添加到特定位置时运行特定命令。

最佳答案

我不知道人们是如何将内容上传到这个文件夹的,但是你可能想要使用比使用 inotify 监视目录技术含量低的东西。

如果协议(protocol)是 FTP 并且您可以访问 FTP 服务器的日志,我建议跟踪该日志以观察上传是否成功。这种事件触发的方法比使用传统 cron 的轮询方法更快、更可靠、负载更小,并且比使用 inotify 的方法更便携、更容易调试。

您处理此问题的方式当然取决于您的 FTP 服务器。我有一个正在运行 vsftpd其日志包含如下行:

Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16"
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644"

只有当 vsftpd 成功保存文件时,UPLOAD 行才会被添加。您可以像这样在 shell 脚本中解析它:

#!/bin/sh

tail -F /var/log/vsftpd.log | while read line; do
  if echo "$line" | grep -q 'OK UPLOAD:'; then
    filename=$(echo "$line" | cut -d, -f2)
    if [ -s "$filename" ]; then
      # do something with $filename
    fi
  fi
done

如果您使用的是 HTTP 上传工具,请查看该工具是否具有用于记录传入文件的文本日志文件。如果它不考虑向其添加某种记录器功能,那么它将生成您可以tail 的日志。

关于linux - 添加文件时运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956668/

相关文章:

bash - 如何使用 Bash 脚本测试是否存在多个文件

bash - `test` 在附加行上使用 `stdin`

linux - 为什么 bash 中的所有命令都是小写的?

bash shell脚本找到几个文件的最接近的父目录

C — 使用 chdir() 函数

linux - 如何在 shell 中重复破折号(连字符)

linux - 我的 bash 脚本有问题

arrays - 如何使用 node.js 将多个 json 对象合并到一个 json 文件中

linux - 如何在 shell 中启 Action 业,即使启动它的 shell 终止,该作业也会持续存在

linux - 将 "table-data"文件转换成 CSV 格式