每24小时无法运行一次Shell脚本

时间:2019-08-29 12:23:42

标签: shell automation scheduled-tasks

我写了一个运行一些命令的shell脚本。我添加了一种逻辑,每24小时运行一次此脚本。但是它只运行一次,然后不运行。 脚本如下:

#!/bin/bash
while true; do
  cd /home/ubuntu/;
  DATE=`date '+%Y-%m-%d'`;
  aws s3 cp --recursive "/home/ubuntu/" s3://bucket_name/$DATE/;
  rm -r -f ./*;
  # sleep 24 hours
  sleep $((24 * 60 * 60))
done

为什么不每24小时运行一次?脚本运行时没有出现任何错误。复制大约需要10分钟。

2 个答案:

答案 0 :(得分:1)

  1. 好的做法是再次运行多次以保护脚本。

    在这种情况下,可以确定只有1个实例在运行。

    #!/bin/bash
    
    LOCKFILE=/tmp/block_file
    
    if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null;
    then
        trap 'rm -f "$LOCKFILE"; exit $?' INT TERM EXIT
    
    while true; do
      cd /home/ubuntu/;
      DATE=`date '+%Y-%m-%d'`;
      aws s3 cp --recursive "/home/ubuntu/" s3://bucket_name/$DATE/;
      rm -r -f ./*;
      # sleep 24 hours
      sleep $((24 * 60 * 60))
    done
    
    rm -f "$LOCKFILE"
       trap - INT TERM EXIT
    
    else
       echo "Warning. Script is already running!"
       echo "Block by PID  $(cat $LOCKFILE) ."
       exit
    fi
    
  2. 您可以运行不受挂断影响的脚本。

    nohup是UNIX实用程序,它运行指定的命令而忽略通信丢失信号(SIGHUP)。因此,即使用户注销,该脚本也将继续在后台运行。

    nohup ./yourscript.sh
    

    创建的文件/tmp/block_file将安全运行脚本,以防止多次运行。要完成它,请按ctrl+c或在终端中运行kill -11 pidofyourscript,这样/tmp/block_file将被删除。
    脚本的输出放在文件nohup.out中。

    要在后台运行(首选方式):

    nohup ./yourscript.sh &
    

答案 1 :(得分:-1)

您的脚本可能由于不活动或退出Shell而被杀死。正确的方法是使用cron,如@ Christian.K所述。参见https://help.ubuntu.com/community/CronHowto