2013-07-29 71 views
2

我想保持輪詢文件,直到它到達位置1小時。如何保持目錄中的輪詢文件,直到它到達Unix

我的目錄:/home/stage

文件名(我在找)abc.txt

我想保持輪詢目錄/home/stage 1小時,但在1小時內,如果abc.txt文件到達那應停止輪詢,並應顯示消息file arrived,否則1小時後應顯示file has not arrived

有沒有辦法在Unix中實現這一點?

+2

一種選擇是使用[inotify的(http://en.wikipedia.org/wiki/Inotify)。 – devnull

+0

你能給我舉個例子嗎?或者如何使用這個? – Pooja25

回答

3

另一個bash方法,不依賴於陷阱處理程序和信號,如果你的更大的範圍已經使用了他們其他的東西:

#!/bin/bash 
interval=60 
((end_time=${SECONDS}+3600)) 

directory=${HOME} 
file=abc.txt 

while ((${SECONDS} < ${end_time})) 
do 
    if [[ -r ${directory}/${file} ]] 
    then 
    echo "File has arrived." 
    exit 0 
    fi 
    sleep ${interval} 
done 

echo "File did not arrive." 
exit 1 
+0

謝謝:)它工作得很好 – Pooja25

0

您可以使用inotify監視修改目錄,然後檢查文件是否爲abc.txt。 inotifywait(1)命令可讓您直接從shell腳本的命令行執行此操作。詳細信息請查看手冊頁。這是基於通知的。

基於輪詢的事情是一個循環,檢查文件是否存在,如果沒有,在再次檢查之前睡眠一段時間。這也是一個簡單的shell腳本。

+0

inotifywait(1)命令是錯誤的,我沒有得到任何手動文本。你能不能給我這個sytax,以便我可以嘗試運行它。 – Pooja25

+0

這個命令在我的結尾不起作用:-bash:inotifywait:command not found – Pooja25

+0

這並不是說它不起作用,它沒有安裝在你的機器上。先安裝它,然後嘗試閱讀手冊頁。 –

3

以下腳本應該適合您。它會每分鐘輪詢該文件一個小時。

#!/bin/bash 
duration=3600 
interval=60 
pid=$$ 
file="/home/stage/abc.txt" 

(sleep ${duration}; { ps -p $pid 1>/dev/null && kill -HUP $pid; }) & 
trap "echo \"file has not arrived\"; kill $pid" SIGHUP 

while true; 
do 
    [ -f ${file} ] && { echo "file arrived"; exit; } 
    sleep ${interval} 
done 
+0

要記住殺死的伎倆。這裏有一堆新東西:) – Evert

+0

回聲'文件未到達'並退出信號處理程序會更清晰。 –

+0

@WilliamPursell不能同意更多!上面編輯。 – devnull

1

這裏有一個inotify的腳本來檢查abc.txt

#!/bin/sh 

timeout 1h   \ 
    inotifywait  \ 
    --quiet  \ 
    --event create \ 
    --format '%f' \ 
    --monitor /home/stage | 
    while read FILE; do \ 
     [ "$FILE" = 'abc.txt' ] && echo "File $FILE arrived." && kill $$ 
    done 

exit 0 

timeout命令在一小時後退出該過程。在文件到達的情況下,該進程會自殺。

0

這裏是一些答案與重試:

cur_poll_c=0 
echo "current poll count= $cur_poll_c" 

while (($cur_poll_c < $maxpol_count)) && (($SECONDS < $end_time)) 
do 
    if [[ -f $s_dir/$input_file ]] 
    then 
    echo "File has arrived... 
do some operation... 
sleep 5  
    exit 0 
    fi 
    sleep $interval 
echo "Retring for $cur_poll_c time .." 
cur_poll_c=`expr $cur_poll_c+1`; 
done 
相關問題