我想保留轮询文件,直到它到达该位置1小时。
我的目的地:/home/stage
文件名(我正在寻找):abc.txt
我想保持轮询目录/home/stage
1小时,但是如果abc.txt
文件到达则在1小时内它应该停止轮询并且应该在1小时后显示消息file arrived
应显示file has not arrived
。
有没有办法在Unix中实现这一点?
答案 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
#!/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