Shell脚本全天运行以在特定时间创建文件

时间:2018-06-19 15:43:46

标签: bash shell unix

我希望创建一个Shell脚本,该脚本将在一天中的特定时间创建文件。

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

时间为 01:00 小时,应创建 abc.txt

时间为 06:00小时时,应创建 def.txt

时间为 13:00小时时,应创建 hij.txt

时间为 23:00小时时,应创建 xyz.txt

所有文件都应包含“ 这是测试文件。”这样的内容,以使文件大小大于0个字节。

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

function getValueAt(object, searchPath) {
  return searchPath.reduce((c, v) => c[v] ? c[v] : null, object);
}

var obj = {'k1': {'k2': {'k3': 'Test Value'}}};

var result = getValueAt(obj, ['k1', 'k2', 'k3']);

console.log(result);

等等...

1 个答案:

答案 0 :(得分:1)

在大多数情况下,应使用诸如How to run a script at a certain time on Linux?之类的已有答案中所述的调度工具,例如atcron;但是,如果您确实需要长时间运行的脚本,则以下内容将一直运行到一天结束,以查询时间。

因为它使用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