我想保持輪詢文件,直到它到達位置1小時。如何保持目錄中的輪詢文件,直到它到達Unix
我的目錄:/home/stage
文件名(我在找):abc.txt
我想保持輪詢目錄/home/stage
1小時,但在1小時內,如果abc.txt
文件到達那應停止輪詢,並應顯示消息file arrived
,否則1小時後應顯示file has not arrived
。
有沒有辦法在Unix中實現這一點?
我想保持輪詢文件,直到它到達位置1小時。如何保持目錄中的輪詢文件,直到它到達Unix
我的目錄:/home/stage
文件名(我在找):abc.txt
我想保持輪詢目錄/home/stage
1小時,但在1小時內,如果abc.txt
文件到達那應停止輪詢,並應顯示消息file arrived
,否則1小時後應顯示file has not arrived
。
有沒有辦法在Unix中實現這一點?
另一個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
謝謝:)它工作得很好 – Pooja25
您可以使用inotify監視修改目錄,然後檢查文件是否爲abc.txt。 inotifywait(1)命令可讓您直接從shell腳本的命令行執行此操作。詳細信息請查看手冊頁。這是基於通知的。
基於輪詢的事情是一個循環,檢查文件是否存在,如果沒有,在再次檢查之前睡眠一段時間。這也是一個簡單的shell腳本。
以下腳本應該適合您。它會每分鐘輪詢該文件一個小時。
#!/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
這裏有一個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
命令在一小時後退出該過程。在文件到達的情況下,該進程會自殺。
這裏是一些答案與重試:
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
一種選擇是使用[inotify的(http://en.wikipedia.org/wiki/Inotify)。 – devnull
你能給我舉個例子嗎?或者如何使用這個? – Pooja25