每天使用不同的参数运行 cronjob

Sai*_*han 12 cron

我是一名程序员,对 cron 了解不多,但我想知道这是否可能。

假设我有一个数组[option1, option2, option3]和一个在 NodeJS 中运行的脚本,名为script.js. 我想每天凌晨 1 点运行这个脚本。这个cron命令是:

0 1 * * * node ~/script.js
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分,我想每天轮换选项,例如,我想在星期一运行node ~/script.js option1,第二天node ~/script.js option2等等。另外,我希望能够在需要时添加/删除选项,但旋转应该保持不变。

这有可能吗?我知道我也可以在节点内执行此操作,但我宁愿从脚本外部执行此操作,并保持脚本原样。

Kon*_*ski 20

假设您希望一周中的每一天都有不同的选择。你可以:

  1. 有一个单独的 cron 工作:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    
    Run Code Online (Sandbox Code Playgroud)

    等等...

  2. bash为您提供所需的选项:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    
    Run Code Online (Sandbox Code Playgroud)

    (我没有运行后者,所以它可能需要一些调整 - 但这是一般的想法。)

  • 感谢您的回答,但我认为它会变得一团糟。我真的需要在某处定义一个数组,否则它将无法工作。我无法使用 `echo option1` 等,因为我的选择可能每周都不同。我只是在我的 Node 应用程序中执行此操作,并跟踪我在数据库中最后运行的那个。 (2认同)

MvG*_*MvG 15

另外,我希望能够在需要时添加/删除选项,但旋转应该保持不变。

这很棘手。修改选项列表后轮换保持不变是什么意思?毕竟,您可以完全重建列表,破坏任何关于您所在位置的线索。

您可能会做的是设置一个目录,其中包含代表您的选项的文件(通过它们的文件名或它们的内容)。然后,无论何时执行 cron 作业,您都会列出该目录,并按上次修改时间对文件进行排序。您使用最旧的条目,touch该文件将其修改时间更改为当前时间,然后使用它来运行脚本。

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你也可以为 cron 把它写成一行,但它会变得更难阅读。

添加选项意味着将新文件添加到选项目录。删除选项意味着删除文件。在任何时候,最旧的文件都是下一个要运行的文件,因此将在循环的最后添加新选项,就好像刚刚运行过一样。如果您想重新排列选项,您可以按您想要的任何顺序触摸它们。

  • `$(ls -rt | head -n1)` 当然会在包含换行符的文件名上中断,但为此,您可能只需“不要那样做”就可以逃脱。 (2认同)

EEA*_*EAA 13

不,我想不出干净的方法来做到这一点。只需编写一个简单的 shell 包装器脚本来检查日期并每天使用您所需的选项启动您的节点应用程序。