如何将轮询文件保存在目录中,直到它到达Unix

时间:2013-07-29 12:15:41

标签: unix

我想保留轮询文件,直到它到达该位置1小时。

我的目的地:/home/stage

文件名(我正在寻找)abc.txt

我想保持轮询目录/home/stage 1小时,但是如果abc.txt文件到达则在1小时内它应该停止轮询并且应该在1小时后显示消息file arrived应显示file has not arrived

有没有办法在Unix中实现这一点?

5 个答案:

答案 0 :(得分:6)

另一个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

答案 1 :(得分:4)

以下脚本应该适合您。它将每分钟轮询该文件一小时。

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

答案 2 :(得分:3)

这是一个用于检查abc.txt

的inotify脚本
#!/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命令在一小时后退出进程。如果文件到达,该过程将自行终止。

答案 3 :(得分:1)

您可以使用inotify监视目录以进行修改,然后检查文件是否为abc.txt。 inotifywait(1)命令允许您直接从shell脚本中的命令行执行此操作。有关详细信息,请查看手册页。这是基于通知的。

基于轮询的事物将是一个循环,它检查文件是否存在,如果不存在,则在再次检查之前休眠一段时间。这也是一个简单的shell脚本。

答案 4 :(得分: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