添加文件时运行 shell 命令
- 2024-10-28 08:37:00
- admin 原创
- 61
问题描述:
我的 Linux 机器上有一个名为 images 的文件夹。此文件夹连接到一个网站,网站管理员可以向该网站添加图片。但是,添加图片后,我希望运行命令来调整目录中所有图片的大小。
简而言之,我想知道如何让服务器在新文件添加到特定位置时运行特定命令。
解决方案 1:
我不知道人们是如何将内容上传到这个文件夹的,但你可能想使用一些比使用 inotify 监控目录更低级的方法。
如果协议是 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"
UPLOAD
仅当 vsftpd 成功保存文件后才会添加此行。您可以在 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
。
解决方案 2:
就像 John 所评论的一样,inotify
API 是一个起点,但是您可能对一些使用此 API 执行文件通知任务的工具感兴趣:
例如,当检测到文件或目录更改时,可以使用incron来运行类似 cron 的任务。
或者inotify-tools,它是一组命令行工具,您可以使用它来构建自己的文件通知 shell 脚本。
如果您查看 Wiki 包底部的 inotify-tools,您将看到对更多工具的引用以及对 Python、Perl 或Ruby等更高级语言的支持(示例代码)。
解决方案 3:
你可能想看看inotify
inotify API 提供了一种监控文件系统事件的机制。Inotify 可用于监控单个文件或目录。当监控目录时,inotify 将返回目录本身以及目录内文件的事件。
解决方案 4:
#!/bin/bash
tail -F -n0 /var/log/vsftpd.log | while read line; do
if echo "$line" | grep -q 'OK UPLOAD:'; then
filename=$(echo $line | cut -d, -f2 |awk '{print $1}')
filename="${filename%\"}"
filename="${filename#\"}"
#sleep 1s
if [ -s $filename ]; then
# do something with $filename
echo $filename
fi
fi
done
解决方案 5:
使用 ghotis 工作
以下是我为获取用户可用空间所做的事情:
#!/bin/bash
tail -F -n 1 /var/log/vsftpd.log | while read line; do
if echo "$line" | grep -q 'OK LOGIN:'; then
pid=$(sed 's/.*[([^]]*)].*//g' <<< "$line")
#the operator '<<<' doesnt exist in dash so use bash
if [[ $pid != *"pid"* ]]; then
echo -e "Disk 1: Contains Games:
" > /home/vftp/"$pid"/FreeSpace.txt; df -h /media/Disk1/ >> /home/vftp/"$pid"/FreeSpace.txt
echo -e "
In order to read this properly you need to use a text editor that can read *nix format files" >> /home/vftp/"$pid"/FreeSpace.txt
fi
echo "checked"
# awk '{ sub("
$", ""); print }' /home/vftp/"$pid"/FreeSpace.txt > /home/vftp/"$pid"/FreeSpace.txt
fi
done
解决方案 6:
如果文件是通过 HTTP 上传添加的,并且您的服务器是 apache,则您可能需要检查 mod_security。
它使您能够为通过 HTTP POST 进行的每个上传运行脚本。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件