我希望创建一个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);
等等...
答案 0 :(得分:1)
在大多数情况下,应使用诸如How to run a script at a certain time on Linux?之类的已有答案中所述的调度工具,例如at
或cron
;但是,如果您确实需要长时间运行的脚本,则以下内容将一直运行到一天结束,以查询时间。
因为它使用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