2012-06-08 195 views
10

我的Linux機器上有一個名爲images的文件夾。 此文件夾已連接到網站,並且該網站的管理員可以將圖片添加到此網站。但是,添加圖片時,我想要一個命令來運行調整目錄中所有圖片的大小。添加文件時運行shell命令

總之,我想知道如何在新文件添加到特定位置時使服務器運行特定命令。

+0

http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –

回答

22

我不知道人們是如何上傳內容到這個文件夾的,但是您可能想要使用比通過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

+0

這是完美的。我實際上使用php/html上傳按鈕。但是我只能從apache掃描訪問文件來獲取上傳頁面。 – Cripto

+1

我在這裏沒有看到的是你正在做什麼來觸發尾部日誌文件的腳本。 –

+1

@JasonGray,你是否熟悉'tail'的'-F'選項?詳情請參見['man尾巴](http://www.freebsd.org/cgi/man.cgi?query=tail)。 '-F'使'tail'等待文件增長,然後發送到stdout。所以

'do something'
部分的「觸發器」就是將新內容添加到文件中。此腳本可能在啓動時運行一次,並繼續運行。您如何啓動它取決於您,取決於您的操作系統或發行版。 – ghoti

3

你可能想看看inotify

inotify的API提供用於監控文件系統事件的機制。 Inotify可用於監視單個文件或監視目錄。當監視目錄時,inotify將返回目錄本身的事件以及目錄中的文件。

4

像約翰評論的inotify API是一個起點,但您可能會感興趣的一些工具,利用這個API來執行文件通知任務:

例如incron可用於運行cron-像檢測到文件或目錄更改時一樣。

inotify-tools這是一組命令行工具,可用於構建自己的文件通知shell腳本。

如果您查看Wiki pake底部的inotify-tools,您將看到更多工具的引用以及對Python,Perl或Rubyexample code)等更高級別語言的支持。

0

使用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 
0

如果該文件是通過HTTP上傳補充說,如果你的服務器是Apache的,你可能想檢查mod_security。

它使您可以爲通過HTTP POST進行的每次上載運行腳本。

0
#!/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