【问题标题】:Apply sed to crontab lines?将 sed 应用于 crontab 行?
【发布时间】:2010-11-18 02:48:26
【问题描述】:

我想以编程方式更改某些 cron 作业的执行时间。 我不确定我的做法是否正确,但这是计划。

可能会更改的作业将在“#change-enabled”行的末尾添加注释。

15 5 7,14,21,28 * * /path/to/executable1 #change-enabled
15 * * * * /path/to/executable2
45 5 */2 * * /path/to/executable3 #change-enabled

然后我想通过 sed 将“crontab -l”的输出通过管道传输,以捕捉和更改最后带有该注释的作业,并通过“crontab -”传输结果。

// 编辑

我的直觉告诉我不要以 root 身份执行此操作,因为新时间是使用来自第 3 方的数据确定的。 (Google Analytics Data Export API)所以 /etc/cron.d/ 是我要远离这个应用程序的东西。

这是在调试期间一直在处理我当前所有 cron 作业的命令。我一直在使用 "date +%l" 代替 "/home/user/slow-hour" 并省略 "| cron -" 以查看我的打印内容。

crontab -l | sed -e "s/^\([^ ]*\) [0-9]* \(.*#change-enabled\)/\1`/home/user/slow-hour` \2/" | crontab -

~/slow-hour 的内容将是一个脚本,它在 Google Analytics 中获取网站配置文件的每小时数据并查找最慢的时间。如果脚本会在凌晨 1 点返回任何错误,请给我发送通知,然后保释。

为了减少由于慢速时间早于当前时间而跳过一天执行的可能性,自动 cron 重新调度程序将设置为在午夜运行,最早的时间 ~/slow-hour 将返回凌晨 1 点。

根据我过去的手动 cron 作业调整,我不认为将午夜排除在最慢的时间之外对我来说是个问题。

【问题讨论】:

    标签: linux unix sed cron


    【解决方案1】:

    crontab -l | sed '/change-enabled$/s/pat/repl/' | crontab -

    【讨论】:

      【解决方案2】:

      假设您要将小时设置为 8,则一个命令是

      sed -e 's/\([0-9]*\) [0-9]* \(.*#change-enabled\)/\1 8 \2/'
      

      【讨论】:

      • 如果分钟设置包含非数字字符,例如*/2,则不起作用。
      • 我的模式基于这个答案,将引号换成允许在替换字符串中执行的引号,并根据需要换出 8。
      【解决方案3】:

      您可以这样做,但有更好的方法(前提是您有 root 访问权限)。

      不要更改 crontab,而是将作业拆分为相关组。对于每个组,在/etc/cron.d/{jobname} 中放置一个新文件。这样您就可以毫无问题地重新生成一个脚本 - 不需要 sed 魔法。将可以更改的所有内容拆分为单独的文件,这样您只需编写一个新文件来代替旧文件,而不会弄乱不需要更改的条目。

      唯一的区别是语法。而不是:

      <time> <command>
      

      你必须放在那里:

      <time> <user> <command>
      

      以便以正确的权限运行作业。

      示例 - 而不是 'crontab -l | sed -e 's/....somejob.../.../ | crontab ..' just run 'echo .... &gt; /etc/cron.d/somejob'

      【讨论】:

      • 我几乎同意了,但对 root 的需求让我三思而后行。
      • 很公平。虽然它可以安全地完成 - 运行一个“更新程序”cron 作业,该作业需要一个包含 一个小时的文件(一个数字,没有字母、符号等),如果它是正确的 - 更新 cron 作业.然后以非特权用户或“nobody”身份运行创建该文件的脚本。
      【解决方案4】:
      crontab -l | sed -re '/# *change-enabled *$/s/^([^ ]+) [^ ]+/\1 new_hour/' | crontab -
      

      【讨论】:

      • 我按原样收到以下错误。 "sed: -e expression #1, char 2: command after extra characters"
      • sed 风味问题,我猜。进行了编辑,希望能在全球范围内更加兼容。
      猜你喜欢
      • 2015-07-04
      • 1970-01-01
      • 2016-07-19
      • 2020-03-28
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2011-12-20
      • 2022-01-10
      相关资源
      最近更新 更多