【问题标题】:Shell script to run through the day to create files at particular timeShell 脚本在特定时间运行以创建文件
【发布时间】:2018-06-19 15:43:45
【问题描述】:

我希望创建一个 shell 脚本,它会在一天中的特定时间点创建文件。

示例案例。 执行 shell 脚本后,应在一天中的特定时间在 /tmp/work/ 目录中创建文件。

当时间是 01:00 小时,应该创建 abc.txt

当时间是06:00 Hrs时,应该创建def.txt

当时间是13:00 Hrs时,应该创建hij.txt

当时间是23:00 Hrs时,应该创建xyz.txt

所有文件都应该有一些内容为“这是测试文件。”以使文件大小超过 0 字节。

是否可以在那个时间点执行下面?

echo "THIS IS TEST FILE." > /tmp/work/abc.txt  ## at 01:00 Hrs
echo "THIS IS TEST FILE." > /tmp/work/def.txt  ## at 06:00 Hrs

等等……

【问题讨论】:

  • 看看 "cron" 及其 "crontab" computerhope.com/unix/ucrontab.htm
  • 这看起来像是一个严重混淆的“真正需要”(另请参阅XY problem ] 问题是您将得到非常通用的答案,很可能会错过您的实际问题。例如:做它们需要每天在同一时间创建?文件名中的数字后缀怎么样,它是每天从 1 重新开始还是继续增加?等等。更多细节 == 更好的答案。
  • “只运行一次”(已编辑)?那么听起来你想要一份at 的工作,而不是cron 的工作。同样,我们已经有适合任务的问答条目。
  • ...如果您需要与我们已经介绍的内容不同的内容,请务必清楚地解释为什么现有答案不适合任务(理想情况下,您如何尝试应用它们,以及这些尝试如何/为什么失败)。
  • 也许你应该添加 autosys 标签。

标签: bash shell unix


【解决方案1】:

在大多数情况下,您应该使用atcron 等调度工具,如How to run a script at a certain time on Linux? 等预先存在的答案中所述;但是,如果您真的需要一个长时间运行的脚本,以下将运行到一天结束,轮询时间。

因为它使用printf %(...)T -1 而不是date 命令来检查时间,所以这种轮询的开销非常低(但需要 bash 4.2 或更高版本)。降低轮询率,例如将sleep 1 更改为sleep 60 会导致更高效但更慢的周期。请注意,sleep 不能保证等待请求的确切时间(尤其是在负载较重的系统上,sleep 60 可以休眠超过请求的 60 秒),因此检查错过的轮询周期很重要!

#!/usr/bin/env bash

case $BASH_VERSION in ''|[123].*|4.[01].*) echo "ERROR: Bash 4.2 or newer required" >&2; exit 1;; esac

declare -A timestops=(
  [01:00]="abc.txt"
  [06:00]="def.txt"
  [13:00]="hij.txt"
  [23:00]="xyz.txt"
)

printf -v run_on_date '%(%Y-%m-%d)T' -1

printf -v last_time '%(%H:%M)T' -1
while sleep 1; do
  printf -v curr_time '%(%H:%M)T' -1
  printf -v curr_date '%(%Y-%m-%d)T' -1
  [[ "$curr_time" = "$last_time" ]] && continue
  [[ "$curr_date" = "$run_on_date" ]] || { echo "Day ${run_on_date} has ended; exiting" >&2; exit 0; }
  for evt_ts in "${!timestops[@]}"; do
    if [[ $curr_time = "$evt_ts" ]] || [[ $curr_time > $evt_ts && $last_time < $evt_ts ]]; then
      evt_file=${timestops[$evt_ts]}
      echo "THIS IS TEST FILE." >"/tmp/work/$evt_file"
    fi
  done
  last_time=$curr_time
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2012-06-18
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多