我想保留轮询文件,直到它到达该位置 1 小时。
我的目录:/home/stage
文件名(我正在寻找):abc.txt
我想将轮询目录/home/stage
保持 1 小时,但在 1 小时内,如果abc.txt
文件到达,则它应该停止轮询并应该显示消息,file arrived
否则 1 小时后它应该显示该消息file has not arrived
。
有没有办法在 Unix 中实现这一点?
我想保留轮询文件,直到它到达该位置 1 小时。
我的目录:/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
以下脚本应该适合您。它会每分钟轮询文件一个小时。
#!/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
命令在一小时后退出该过程。如果文件到达,该进程会自行终止。
您可以使用 inotify 监视目录是否有修改,然后检查文件是否为 abc.txt。inotifywait(1) 命令让您可以直接从 shell 脚本中的命令行执行此操作。查看手册页以获取详细信息。这是基于通知的。
基于轮询的事物将是一个循环,检查文件是否存在,如果不存在,则在再次检查之前休眠一段时间。这也是一个简单的 shell 脚本。
这里有一些重试的答案:
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