需要在特定时间中止该过程

时间:2013-07-02 05:48:45

标签: shell unix

我有一个场景,文件将在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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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....

&安培;在11:30 timeout下运行(根据您的要求使用atcron。)

timeout -s SIGUSR1 10m /path/to/myscript.sh arg1 arg2 arg3 ...

答案 2 :(得分:0)

有几种建议的方法:

  1. 如果在具有inotify支持的系统上运行,请使用inotifywait(来自Debian inotify-tools程序包)等工具立即通知您所监视目录/文件的更改。如果在指定的超时期限内未执行任何操作,则可以使用-t选项超时。如果使用此工具,您可能必须在检查shell脚本中是否存在文件与运行inotifywait命令之间处理竞争条件。

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

  3. 如果使用bash,请测试内置SECONDS变量作为循环条件的一部分,并在计时器到期时退出。如果bash不可用,则替代方法是使用date命令,并以秒为单位格式化输出。请参阅this answer

  4. 目前,所呈现的代码在非常紧密的轮询循环中运行。在某处放置sleep是个好主意。