我的Linux機器上有一個名爲images的文件夾。 此文件夾已連接到網站,並且該網站的管理員可以將圖片添加到此網站。但是,添加圖片時,我想要一個命令來運行調整目錄中所有圖片的大小。添加文件時運行shell命令
總之,我想知道如何在新文件添加到特定位置時使服務器運行特定命令。
我的Linux機器上有一個名爲images的文件夾。 此文件夾已連接到網站,並且該網站的管理員可以將圖片添加到此網站。但是,添加圖片時,我想要一個命令來運行調整目錄中所有圖片的大小。添加文件時運行shell命令
總之,我想知道如何在新文件添加到特定位置時使服務器運行特定命令。
我不知道人們是如何上傳內容到這個文件夾的,但是您可能想要使用比通過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
。
這是完美的。我實際上使用php/html上傳按鈕。但是我只能從apache掃描訪問文件來獲取上傳頁面。 – Cripto
我在這裏沒有看到的是你正在做什麼來觸發尾部日誌文件的腳本。 –
@JasonGray,你是否熟悉'tail'的'-F'選項?詳情請參見['man尾巴](http://www.freebsd.org/cgi/man.cgi?query=tail)。 '-F'使'tail'等待文件增長,然後發送到stdout。所以
'do something'部分的「觸發器」就是將新內容添加到文件中。此腳本可能在啓動時運行一次,並繼續運行。您如何啓動它取決於您,取決於您的操作系統或發行版。 – ghoti
你可能想看看inotify
inotify的API提供用於監控文件系統事件的機制。 Inotify可用於監視單個文件或監視目錄。當監視目錄時,inotify將返回目錄本身的事件以及目錄中的文件。
像約翰評論的inotify
API是一個起點,但您可能會感興趣的一些工具,利用這個API來執行文件通知任務:
例如incron可用於運行cron-像檢測到文件或目錄更改時一樣。
或inotify-tools這是一組命令行工具,可用於構建自己的文件通知shell腳本。
如果您查看Wiki pake底部的inotify-tools,您將看到更多工具的引用以及對Python,Perl或Ruby(example code)等更高級別語言的支持。
使用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/.*\[\([^]]*\)\].*/\1/g' <<< "$line")
#the operator '<<<' doesnt exist in dash so use bash
if [[ $pid != *"pid"* ]]; then
echo -e "Disk 1: Contains Games:\n" > /home/vftp/"$pid"/FreeSpace.txt; df -h /media/Disk1/ >> /home/vftp/"$pid"/FreeSpace.txt
echo -e "\r\n\r\nIn 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("\r$", ""); print }' /home/vftp/"$pid"/FreeSpace.txt > /home/vftp/"$pid"/FreeSpace.txt
fi
done
如果該文件是通過HTTP上傳補充說,如果你的服務器是Apache的,你可能想檢查mod_security。
它使您可以爲通過HTTP POST進行的每次上載運行腳本。
#!/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
http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –