Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用shell脚本在上午9点到9:30检查文件是否存在,并停止检查是否在这段时间内找到文件_Bash_Shell_Ksh - Fatal编程技术网

Bash 使用shell脚本在上午9点到9:30检查文件是否存在,并停止检查是否在这段时间内找到文件

Bash 使用shell脚本在上午9点到9:30检查文件是否存在,并停止检查是否在这段时间内找到文件,bash,shell,ksh,Bash,Shell,Ksh,我的目的是每5分钟在不同的时间检查一次文件,下面是我的目标和实现 目标: To check for file file1 from 9 to 9:30 To check for file file2 from 11 to 11:30 To check for file file3 from 10 to 10:30 To check for file file4 from 4 to 4:30 检查_File.sh 更新代码: 但是,如果我找到了文件,我真的不想检查发生了什

我的目的是每5分钟在不同的时间检查一次文件,下面是我的目标和实现

目标:

  To check for file file1 from  9 to  9:30
  To check for file file2 from 11 to 11:30
  To check for file file3 from 10 to 10:30
  To check for file file4 from  4 to  4:30
检查_File.sh

更新代码:

但是,如果我找到了文件,我真的不想检查发生了什么,我很困惑怎么做

如果我没有在指定的时间内找到包含的文件,我将不得不发送一封邮件。
是否有其他方法可以处理此问题。

只需从cron运行脚本一次,让脚本休眠5分钟,直到所需的时间过去,然后发送电子邮件。这样,所有状态都包含在脚本的一次运行中,您不需要向磁盘写入任何内容来记住以前运行的状态。

只需从cron运行脚本一次,让脚本休眠5分钟,直到所需的时间过去,然后发送电子邮件。这样,所有状态都包含在脚本的一次运行中,您无需向磁盘写入任何内容来记住以前运行的状态。

如果您找到一个文件,您可以创建一个时间戳文件:

if [ -f /home/test/$1 ];  then
  echo "File \"/home/test/$1" exists”
  touch /tmp/$1.timestamp
else 
  echo "File not found"
fi
如果时间是X:30(可能公差为一分钟),并且从今天起没有时间文件,则可以发送邮件


触摸将用当前时间更新现有文件,如果不存在文件,则创建新文件

如果找到以下文件,则可以创建时间戳文件:

if [ -f /home/test/$1 ];  then
  echo "File \"/home/test/$1" exists”
  touch /tmp/$1.timestamp
else 
  echo "File not found"
fi
如果时间是X:30(可能公差为一分钟),并且从今天起没有时间文件,则可以发送邮件


触摸将用当前时间更新现有文件,如果不存在文件,则创建新文件

cron
开始,在30分钟时间段开始时只运行一次类似的操作:

#!/bin/bash

MESSAGE="Some message"
SUBJECT="Some subject"
RECIPIENT="somebody@somewhere.com"

# Test for 30 minutes
for ((i=0;i<7;i++)) ; do
   if [ -f /home/test/"$1" ];  then
      echo "File /home/test/$1 exists”
      exit 0
   fi
   # Sleep 5 minutes
   sleep 300
done

# Failed to find file in specified time
echo "$MESSAGE" | mailx -s "$SUBJECT" $RECIPIENT

cron
开始,在30分钟时间段开始时只运行一次类似的程序:

#!/bin/bash

MESSAGE="Some message"
SUBJECT="Some subject"
RECIPIENT="somebody@somewhere.com"

# Test for 30 minutes
for ((i=0;i<7;i++)) ; do
   if [ -f /home/test/"$1" ];  then
      echo "File /home/test/$1 exists”
      exit 0
   fi
   # Sleep 5 minutes
   sleep 300
done

# Failed to find file in specified time
echo "$MESSAGE" | mailx -s "$SUBJECT" $RECIPIENT

其他解决方案的变体,允许您在命令行中指定持续时间和间隔,例如,以5分钟的间隔运行30分钟,以3分钟的间隔运行60分钟,等等

注意:借用Mark Setchell的邮件代码

#!/bin/bash

filename=${1:-undefined}
durationmins=${2:-30}      # default to 30 min duration
sleepmins=${3:-5}          # default to  5 min intervals

MESSAGE="Some message"
SUBJECT="Some subject"
RECIPIENT="somebody@somewhere.com"

while true
do
        dt=$(date '+%Y/%m/%d %H:%M:%S')

        [ -f "${filename}" ]                        && \
        echo "${dt} - File '${filename}' exists"    && \
        exit 0

        durationmins=$((durationmins - sleepmins))

        [ ${durationmins} -lt 0 ] && break

        echo "${dt} - File '${filename}' not found, sleeping ${sleepmins} minute(s) ..."

        sleep $((sleepmins * 60))
done

dt=$(date '+%Y/%m/%d %H:%M:%S')

echo "${dt} - File '${filename}' not found, sending email ..."

echo "$MESSAGE" | mailx -s "$SUBJECT" $RECIPIENT
一些示例调用:

$ ./checkfile.sh file1 30  5        # check for 30 mins @  5 min intervals; 7 checks performed
$ ./checkfile.sh file2 60 10        # check for 60 mins @ 10 min intervals; 7 checks performed
$ ./checkfile.sh file3 15  7        # check for 15 mins @  7 min intervals; 3 checks performed
$ ./checkfile.sh file4              # defaults: check for 30 mins @ 5 min intervals; 7 checks performed

其他解决方案的变体,允许您在命令行中指定持续时间和间隔,例如,以5分钟的间隔运行30分钟,以3分钟的间隔运行60分钟,等等

注意:借用Mark Setchell的邮件代码

#!/bin/bash

filename=${1:-undefined}
durationmins=${2:-30}      # default to 30 min duration
sleepmins=${3:-5}          # default to  5 min intervals

MESSAGE="Some message"
SUBJECT="Some subject"
RECIPIENT="somebody@somewhere.com"

while true
do
        dt=$(date '+%Y/%m/%d %H:%M:%S')

        [ -f "${filename}" ]                        && \
        echo "${dt} - File '${filename}' exists"    && \
        exit 0

        durationmins=$((durationmins - sleepmins))

        [ ${durationmins} -lt 0 ] && break

        echo "${dt} - File '${filename}' not found, sleeping ${sleepmins} minute(s) ..."

        sleep $((sleepmins * 60))
done

dt=$(date '+%Y/%m/%d %H:%M:%S')

echo "${dt} - File '${filename}' not found, sending email ..."

echo "$MESSAGE" | mailx -s "$SUBJECT" $RECIPIENT
一些示例调用:

$ ./checkfile.sh file1 30  5        # check for 30 mins @  5 min intervals; 7 checks performed
$ ./checkfile.sh file2 60 10        # check for 60 mins @ 10 min intervals; 7 checks performed
$ ./checkfile.sh file3 15  7        # check for 15 mins @  7 min intervals; 3 checks performed
$ ./checkfile.sh file4              # defaults: check for 30 mins @ 5 min intervals; 7 checks performed

但是如果电脑在9:15启动怎么办?抱歉,但我不知道如何设置时间,如果找到文件并在结尾发送邮件时停止,我知道如何让脚本休眠5分钟,但是如果电脑在9:15启动怎么办?抱歉,但我不知道如何设置时间并在找到文件时停止,最后发送邮件,我知道如何使脚本休眠5分钟。如果文件名为Check_file.sh,则不应使用/checkfile.sh调用它。顺便说一句:它真的位于根目录中吗?你真的想让它在凌晨4:00运行吗?@ghoti file4在凌晨4:00到4:30如果文件名为Check_file.sh,你不应该用/checkfile.sh来调用它。顺便说一句:它真的位于根目录中吗?你真的希望它在凌晨4:00运行吗?@ghoti file4在凌晨4:00到4:30是使运行时间为35分钟的for循环?是的,它实际上在30分钟时执行最后一次检查,但在退出之前等待5分钟,这有点不必要。我不想让它过于复杂。我想你可以让它
[$I-lt 6]&&sleep 300
是使运行时间为35分钟的for循环?是的,它实际上在30分钟时执行最后一次检查,但在退出之前等待5分钟,有些不必要。我不想把它复杂化。我想你可以把它做成
[$I-lt 6]&&sleep300