我们有 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 运行,则将使用四个参数20230914
、074403
、20230914
和来调用您的脚本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 先进得多)。ksh93
printf
date
我仍然会使用#! /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