如何在 Solaris 上调用带有相对于现在的时间戳的脚本?

如何在 Solaris 上调用带有相对于现在的时间戳的脚本?

我们有 List Error shell 脚本,但我每天手动运行它。我想通过crontab自动运行脚本。

我的脚本:

#!/bin/sh
ent programe -a$1 -b$2 -c$3 -d$4 -tTE -oListErrorTE.txt
grep " ERR1" ListErrorTE.txt
grep " ERR2" ListErrorTE.txt

解释:

$1 = date start >> 20230914
$2 = time start >> 000100
$3 = date end >> 20230914
$5 = time end >> 163000

我想替换参数日期时间开始早于 2 小时并将结束日期时间替换为当前日期时间?

答案1

您的脚本在其命令行上采用四个参数,分别对应于开始日期和时间以及结束日期和时间,并且您似乎希望在不指定特定参数的情况下调用脚本。相反,您希望开始日期和时间为“两小时前”,结束日期和时间为“现在”。

假设您的 Solaris 系统date安装了 GNU(实用程序已列出在官方 Solaris 手册中,所以它至少可以由管理员提供),那么您可以使用它来计算四个参数的值,如下所示:

/some/path/yourscript \
    "$(date -d '2 hours ago' +%Y%m%d)" \
    "$(date -d '2 hours ago' +%H%M%S)" \
    "$(date +%Y%m%d)" \
    "$(date +%H%M%S)"

如果此命令于 2023 年 9 月 14 日 09:44:03 运行,则将使用四个参数2023091407440320230914和来调用您的脚本094403

四个命令替换使用 GNUdate来计算并返回所需的四个日期和时间戳。

如果您担心 的四个调用中的某些调用date位于秒、分钟、小时或天等的不同侧,那么首先获取“now”的 Unix 时间戳,并使用该时间戳的date偏移量来获取所需的时间戳。日期和时间戳:

now=$(date +%s)

offset=$(( -2*60*60 ))    # -2h in seconds

/some/path/yourscript \
    "$(date -d "@$(( now + offset ))" +%Y%m%d )" \
    "$(date -d "@$(( now + offset ))" +%H%M%S )" \
    "$(date -d "@$now" +%Y%m%d )" \
    "$(date -d "@$now" +%H%M%S )"

没有 GNU date,但具有相当最新的版本bash(版本 4.2 或更高版本,根据官方文档):

printf -v now '%(%s)T' -1

offset=$(( -2*60*60 ))    # -2h in seconds

/some/path/yourscript \
    "$( printf '%(%Y%m%d)T' "$(( now + offset ))" )" \
    "$( printf '%(%H%M%S)T' "$(( now + offset ))" )" \
    "$( printf '%(%Y%m%d)T' "$now" )" \
    "$( printf '%(%H%M%S)T' "$now" )"

这使用了内置printf实用程序的特殊日期格式化功能,bash其方式与前面的代码片段类似。首先,它计算“现在”的 Unix 时间戳(将其存储在 shell 变量中now),然后使用它来计算“两小时前”的偏移量,并将格式化的日期和时间戳作为脚本的参数输出。

对于您的 cron 作业,您将获取其中一段代码并安排它。将代码放在一个单独的脚本中可能是最有意义的,yourscript-runner该脚本是用 cron 计划的,而不是尝试直接在 crontab 文件中插入很长的命令,部分原因是该%字符在 cron 计划中是特殊的并且必须被转义,部分原因是这还会为您提供一个单独的脚本来手动运行任务,您是否愿意这样做。

0 0 * * * /some/path/yourscript-runner

(上面的 cron 计划将在每个午夜触发。)

答案2

在标准 Solaris 系统(没有 GNU 日期)上执行此操作(需要一点横向思考)是可能的。

设置一个 cron 作业每两个小时运行一次脚本。

输入时,脚本运行date并将当前日期和时间保存为“开始”参数。

然后它会休眠 7200 秒。

当睡眠到期时,它date再次运行,并将当前日期和时间保存为“结束”参数。

您现在拥有提取前两小时数据所需的四个值。您甚至可以使用结束开始和日期作为结果文件名的一部分。

答案3

从版本 11 开始,Solaris 的内置功能/bin/sh实际上可以进行高级日期操作和格式化(事实上比 GNU 先进得多)。ksh93printfdate

我仍然会使用#! /bin/ksh93 -而不是#! /bin/sh -明确表示它不是标准sh语法,而是 ksh93 语法(就像我不会在bash#! /bin/sh -系统上的脚本中使用 bashism sh):

#! /bin/ksh93 -
eval "${
  printf '
    ent programe %(-a%Y%m%d -b%H%M%S)T %(-c%Y%m%d -d%H%M%S)T -tTE -oListErrorTE.txt
  ' '2 hours ago' now
}"
grep ' ERR1' ListErrorTE.txt
grep ' ERR2' ListErrorTE.txt

相关内容