【问题标题】:How to replace date -d from script running on Linux to get it working on AIX如何从在 Linux 上运行的脚本中替换 date -d 以使其在 AIX 上运行
【发布时间】:2021-06-06 13:31:28
【问题描述】:

在 Linux 系统上,我正在运行运行良好的 bash 脚本,但现在我想在 AIX 系统上使用相同的脚本。
只有一小部分无法运行,因为在 AIX 系统上“date -d”命令不起作用。
下面是在 linux 服务器上运行的代码,在这种情况下基于主机名 system1 和 system2 脚本将仅在给定时间的星期日运行。

        declare -A myservertime
        myservertime["system1"]="02:00"
        myservertime["system2"]="02:10"

        for keys in "${!myservertime[@]}";
            do
                if [[ "$keys" == "$HOSTNAME" ]]; then
                    mylaunchtime=${myservertime["$keys"]}
                fi
            done
        if [ -z "$mylaunchtime" ]; then
            echo "Server not found."
            exit
        fi

        timenow=$(date +"%s")
        weekday=$(date +"%a" -d @$timenow )
        timerun=$(date +"%s" -d ${mylaunchtime} )
        if [ $timerun -lt $timenow ]; then
            timerun=$(( timerun + 86400 ))
        fi
        sleep_time=$(( timerun - timenow ))

        #Check is weekday = Sunday
        if [ $weekday == "Sun" ]; then
                #If Sunday then wait until starttime is reached, until then sleep
                sleep $sleep_time
                #If starttime is reached execute startprogram
                startprogram
        fi

我已经修复了声明部分,这在 AIX 上也不起作用,如下:
typeset -A myservertime=(["pvm00066"]="02:30" ["pvm00100"]="01:30")

但是我很难让变量 $weekday 和 $timerun 工作,因为那个“date -d $variable”

这里的任何人都可以帮助我,我尝试并搜索了所有类型的东西,但我无法找到一个工作。

【问题讨论】:

  • 你能用crontabat吗?
  • 脚本本身开始使用 crontab。应用程序的停止和启动将在脚本本身中完成。这样我就不必使用脚本的多个版本,但我可以简单地在所有需要的 AIX 服务器上使用这个脚本。
  • 我建议使用 perl,因为它可以跨平台使用并且可以进行日期数学运算。

标签: date ksh aix


【解决方案1】:

如果您确实想在所有系统上使用相同的 crontab 和脚本,并且只想在周日运行脚本,则只需使用从 00:00 开始的偏移量。
crontab:

0 0 * * 7 start_with_delay.sh

start_with_delay.sh:

declare -A myservertime
myserversleep["system1"]=7200
myserversleep["system2"]=7800
sleep ${myserversleep[HOSTNAME]}
startprogram

当您不需要固定不同主机的启动时间,而只希望不同主机有不同的启动时间时,可以考虑使用IP的最后一个数字作为计算休眠时间的输入。

您可能会考虑其他解决方案的两个原因:

  1. 使用 crontab 启动作业(从睡眠开始)非常令人困惑。
    阅读 crontab 的操作员期望在 crontab 中给出的时间开始执行某些操作。
    使用 sleep_and_start 之类的脚本名会有所帮助。
  2. 当系统在周日 01:00 重新启动时,02:00 没有启动任何内容
    sleep 命令在重新启动期间已停止。

我会尝试找到一个智能安装脚本,它会在每台主机上编写不同的 crontab。带有 Ansible、Puppet 模板或 shellscript 的东西。

case $HOSTNAME in
system1)
   starthour=2
   startminute=0
;;
system2)
   starthour=2
   startminute=10
;;
*)
   echo "No scheduled startprogram on ${HOSTNAME}.
   exit 0
;;
esac
echo "${startminute} ${starthour} * * SUN startprogram" | crontab -

当你想更新现有的 crontab 时,你可能需要类似的东西

(crontab -l 2>/dev/null && echo "${startminute} ${starthour} * * 7 startprogram") |
   sort -u | crontab -

【讨论】:

  • cron 记录必须是:0 0 * * 7 start_with_delay.sh,cron 不要期望符号名称
  • 在我的 Linux 系统上man -s5 crontab 显示“名称也可用于‘月份’和‘星期几’字段。使用特定日期或月份的前三个字母(大小写不”没关系)。”。我没有检查 AIX,使用 7 将是一个安全的选择。我改变了答案。
  • 在 AIX cron 上期望编号。它可以是 0 或 7(都是星期天):)
猜你喜欢
  • 2019-09-05
  • 2022-08-06
  • 2010-12-02
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多