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