0

我有一个场景,其中文件将在 11:30 到 11:40 之间的任何时间到达。我可以安排一个脚本在 11:30 开始运行,以检查文件是否已到达。这是我随身携带的东西。

i=0
while [ i -eq 0 ]
do
    if [ ! -f $File_Check_Dir/$FILE_NAME ] ; then
        echo " \n File has arrived at `date +'%d-%m-%Y %H:%M:%S'****" | tee -a ${LOGFILE}
        i=1
    fi
done

我可以让脚本在后台运行。但是如果文件在东部时间 11:40 之前还没有到达,我需要检查系统时间并发送警报。我尝试了 systime 函数,但不能完全得到我想要的。

4

3 回答 3

0

您可以获得时间,date +"%H:%M"然后您可以再添加一个“如果”来检查这是否大于 11:40 并在发送适当的通知后退出。

于 2013-07-02T06:10:15.020 回答
0

一种可能的选择:

在您的脚本中:

trap sendMailFunction SIGUSR1
sendMailFunction(){
.
. # Enter your code here, which will send mail in case the file does not arrive in time
.
}
.
. # Remainder of the script....

timeout&在 11:30运行它(使用ator cron,根据您的要求。)

timeout -s SIGUSR1 10m /path/to/myscript.sh arg1 arg2 arg3 ...
于 2013-07-02T06:19:51.350 回答
0

一些建议的方法来做到这一点:

  1. 如果在支持 inotify 的系统上运行,请使用诸如inotifywait(来自 Debianinotify-tools软件包)之类的工具来立即通知您监视的目录/文件的更改。-t如果在指定的超时期限内未发生任何操作,您可以使用超时选项。如果使用此工具,您可能需要注意检查 shell 脚本中文件是否存在和运行inotifywait命令之间的竞争条件。

  2. timeout使用命令包装您的脚本。例如。timeout 10m my-watch-script. 如果在脚本退出之前发生超时,timeout则将返回退出代码 124,然后您可以对其进行测试以确定是否发生超时或找到文件。

  3. 如果使用 bash,请将内置SECONDS变量作为循环条件的一部分进行测试,并在计时器到期时退出。如果 bash 不可用,替代方法是使用该date命令,并在几秒钟内将其格式化输出。看到这个答案

就目前而言,呈现的代码在一个非常紧凑的轮询循环中运行。把一个sleep放在某个地方是个好主意。

于 2013-07-02T06:20:10.507 回答