4

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

我的目录:/home/stage

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

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

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

4

5 回答 5

14

另一种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
于 2013-07-29T14:27:26.980 回答
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
于 2013-07-29T13:12:43.057 回答
2

这是一个用于检查的 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命令在一小时后退出该过程。如果文件到达,该进程会自行终止。

于 2013-07-29T14:28:24.930 回答
1

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

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

于 2013-07-29T12:25:43.443 回答
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
于 2014-11-03T08:17:24.960 回答