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

如何将轮询文件保存在目录中,直到它到达Unix,unix,Unix,我想保留轮询文件,直到它到达该位置1小时 我的目录:/home/stage 文件名(我正在查找):abc.txt 我想保持轮询目录/home/stage1小时,但在1小时内,如果abc.txt文件到达,则应停止轮询并显示消息文件到达,否则1小时后应显示文件未到达 在Unix中有什么方法可以实现这一点吗 您可以使用inotify监视目录的修改,然后检查文件是否为abc.txt。inotifywait(1)命令允许您直接从shell脚本中的命令行执行此操作。查看手册页以了解详细信息。这是基于通知的

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

我的目录:
/home/stage

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

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


在Unix中有什么方法可以实现这一点吗

您可以使用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

另一种
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
#/bin/bash
间隔=60
((结束时间=${SECONDS}+3600))
目录=${HOME}
file=abc.txt
而(${SECONDS}<${end_time}))
做
如果[[-r${directory}/${file}]]
然后
“echo”文件已到达
出口0
fi
睡眠${interval}
完成
echo“文件未到达。”
出口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
命令在一小时后退出进程。如果文件到达,进程将自动终止。

这里有一些关于重试的答案:

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
cur\u poll\u c=0
echo“当前轮询计数=$cur\u poll\u c”
而($cur_poll_c<$maxpol_count))&&($SECONDS<$end_time))
做
如果[-f$s_dir/$input_file]]
然后
“echo”文件已到达。。。
做些手术。。。
睡眠5
出口0
fi
睡眠时间间隔
echo“重新搜索$cur\u poll\u c time…”
cur_poll_c=`expr$cur_poll_c+1`;
完成

一个选项是使用。您能给我举个例子吗?或者如何使用?inotifywait(1)命令错误,我没有得到任何手动尝试。请您给我sytax,以便我可以尝试运行它。此命令在我这边不起作用:-bash:inotifywait:command not found不是因为它不起作用,它没有安装在您的计算机上。请先安装它,然后尝试阅读手册页。记住杀戮诀窍。这里对我来说有很多新东西:)回显“文件未到达”并在信号处理程序中退出会更干净。@williampersell完全同意!上面编辑。
while[true]
有点不可靠。特别是,它的行为与
while[false]完全相同
,这两个函数都返回true,因为它们评估正在测试的字符串是否为空。您可能是指
而true
-+kill-HUP 20221 test\u poll.sh:第7行:kill:(20221)-没有这样的流程脚本工作正常,但成功完成后,它正在运行上述命令,不知道为什么,您是否遇到过同样的问题?