【问题标题】:Cron Job Syntax [closed]Cron 作业语法 [关闭]
【发布时间】:2018-12-10 05:21:18
【问题描述】:

我以前从未创建过,也没有使用过 cron 作业,但我从关于 SO 的众多问题和答案中收集到的是,该过程相当简单,涉及以下内容:

  1. 使用 shell 命令创建 bash 文件
  2. 编辑 crontab

我在 SO 上找到了很多关于 cron 作业的问题和答案,但其中没有一个真正解释了语法。我也尝试在网上寻找可靠的解释,但无济于事。不过我确实找到了this page,,它非常清楚地解释了crontab 语句的时间和日期部分。

这是我目前的理解:

1.创建 bash 脚本,可以放在任何地方。

#!/bin/bash
cd /home/user/public_html/scrapy/projects/myproject/spiders
scrapy crawl mycrawler
  • #!/usr/bin/bash 语句的意义是什么?

  • 为什么被注释掉了?

  • 是否需要使用 shell 脚本作为代理来运行 Python 脚本?

2。通过crontab -e 命令编辑 crontab

我已经看到了很多关于这部分的不同建议,所以我将从几个不同的答案中列出几个例子。


Example #1

PATH=/usr/bin
* 5 * * * cd project_folder/project_name/ && scrapy crawl spider_name
  • 直接在crontab -e 中嵌入命令是否被认为是好的做法?

Example #2

*/5 * * * * /usr/local/bin/python /home/Documents/SCRAPE_PYTHON/SCRAPE.py &>> /home/Desktop/log.txt

  • 在这种情况下,第一条路径/usr/local/bin/python 的意义是什么?

他在回答中指出,&>> /home/Desktop/log.txt 是附加错误和其他输出的文件。

  • &>> 是这样做的吗?

  • 这对每个 Linux 环境都通用吗?


Example #3

*/2 * * * * /home/user/shell_scripts/cj-scrapy.sh

  • 上面的代码怎么不包含两条路径?

  • 将shell脚本放在/home/user/scripts目录下是否存在潜在的安全漏洞?

  • 是否有一个特定目录通常存储此类 shell 脚本?


示例 #4

cPanel Cron 作业向导建议使用以下语法:

/usr/local/bin/php /home/user/public_html/path/to/cron/script


为什么crontab 推荐之间的所有差异?

我了解crontab 的时间和日期部分的语法,但有人可以解释一下其余部分的正确语法吗?

【问题讨论】:

  • 有人能解释一下你为什么投票结束这个问题吗?
  • 最接近的原因是“请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次提出多个不同的问题。”这是一篇文章中的 10 个问题,外加一个非常广泛的“谁能解释 shell 语法”,这两个问题都不适用于 StackOverflow 的格式。将其拆分为单个问题(最好先用谷歌搜索,因为“什么是#!/usr/bin/bash”之类的问题很容易回答)
  • 这里有太多不同的问题。不可能提供一个清晰简洁的答案。因“过于宽泛”而被标记。
  • @MiguelOrtiz 感谢您的解释,尽管我在 SO 的其他地方看到过很多类似的问题?

标签: python linux bash cron


【解决方案1】:

我尝试为您在下面的所有问题和示例提供上下文,但最终的问题是:

  1. 您希望多久执行一次命令?
  2. 您需要执行什么命令?

通常一个 crontab 条目是一个时间指令,后跟一个 shell 命令:

* * * * * shell command
^ ^ ^ ^ ^|^^^^^^^^^^^^^
| | | | |||||||||||||||
   time  |shell command

在 UNIX 中,#!(或shebang)表示应该使用哪个程序来解释后面的脚本。所以#!/usr/local/bin/python 的意思是,用python(又名/usr/local/bin/python)执行下面的脚本,就像/bin/bash 表示下面的脚本应该用bash shell 执行。这看起来像一条评论,因为它是一条评论……它被设计为对python 的评论,因此它不会被解释,但它在执行时对UNIX 有意义(类似于preprocessor directive)。

这个shebang 回答了你的问题:

是否需要使用 shell 脚本作为代理来运行 Python 脚本?

答案是否定的。 shebang 使这个包装完全没有必要。

现在开始你的例子:

示例 1:

PATH=/usr/bin
* 5 * * * cd project_folder/project_name/ && scrapy crawl spider_name

打破这个。 * 5 * * * 表示这个命令应该在每个月(下一个*)的每个月的每一天(下一个*)的第5个小时(5)的每一分钟(第一个*)运行一周中的每一天(最后一个*)。 从时间的角度来看,这几乎肯定不是你想要的。该行的其余部分作为命令字符串执行,因此您将目录更改为project_folder/project_name,然后执行scapy。总的来说这里的crontab位不是你想要的,cd上的相对路径说明这个命令也可能不正确。

直接在 crontab -e 中嵌入命令是否被认为是好的做法?

这就是 crontab 是时间指令后跟一个命令。

示例 #2

*/5 * * * * /usr/local/bin/python /home/Documents/SCRAPE_PYTHON/SCRAPE.py &>> /home/Desktop/log.txt

此命令将在一周中的每一天的每个月的每一天的每个小时的每个5th 分钟运行。这里的/usr/local/bin/python#!/usr/local/bin/python 是多余的,因此完全没有必要。

&>> 会将stdoutstderr (&) 上命令的输出(>>) 附加到文件/home/Desktop/log.txt。这种日志记录很好,每 5 分钟一次可能很好,但是 python bits are not necessary. To answer your second question: yes this isbash` 语法因此适用于每个命令。

示例#3

*/2 * * * * /home/user/shell_scripts/cj-scrapy.sh

这会在一周中的每一天的每个月的每一天的每一小时的每一小时的每一个2nd 分钟执行/home/user/shell_scripts/cj-scraph.sh 程序(可能是一个shell 脚本)。该脚本可能会运行您的 python 脚本。

示例 4

这既不是 python 也不是 cron 作业。

【讨论】:

  • 我以为我理解了shebang 部分,直到您添加了“shebang 使这个包装完全没有必要”。你能解释一下吗?
  • 您不需要将 python 脚本包装在 shell 脚本中,因为 python 脚本具有显示“我是 python”的 shebang。因此,您不需要 shell 脚本(这是非二进制可执行文件的假定脚本语言)来分派到 python 文件。这是shebang 的重点……否则 UNIX 会假定所有非二进制可执行文件都是 shell。
  • 嗯...但是我的 Python 脚本没有 shebang 语句?为了从crontab 执行所有这些操作,以下命令会起作用吗? */2 * * * * /home/user/shell_scripts/cj-scrapy.sh 如果我指向我上面的问题中包含的 shell 脚本? */2 * * * * /usr/bin/python /home/user/public_html/projects/spiders/mycrawler.py scrapy run crawler 如果我在没有 shell 脚本的情况下运行所有​​东西?我究竟如何在crontab 语句中包含scrapy run crawler 部分?!
  • @Anthony 添加shebang作为mycralwer.py的第一行
  • 喜欢地毯式的投反对票。
【解决方案2】:

这里有很多问题,但是:

Cron 作业或 cron 计划是一组特定的执行指令,指定日期、时间和要执行的命令。 crontab 可以有多个执行语句。每个执行语句可以有很多命令(即每行)。

#!/usr/bin/bash 语句的意义是什么?

这是一个shebang。如果脚本以路径 path/to/script 命名,并且它以 shebang 行 #!/usr/bin/bash 开头,则程序加载器被指示运行程序 /usr/bin/bash 并传递它path/to/script 作为第一个参数。

为什么要注释掉?

在计算中,shebang 是由字符数字符号和感叹号 (#!) 组成的字符序列,位于脚本的开头。

是否需要使用 shell 脚本作为代理来运行 Python 脚本?

关于crontab?不,你可以传递很多命令

* * * * * /usr/bin/python script.py

通过 crontab -e 编辑 crontab。简单的回答,是的。这是一个非常快速的参考:

crontab -e    Edit crontab file, or create one if it doesn’t already exist.
crontab -l    crontab list of cronjobs , display crontab file contents.
crontab -r    Remove your crontab file.
crontab -v    Display the last time you edited your crontab file. (This option is only available on a few systems.)

示例 2 您正在告诉 cron 执行 python 脚本。 Cron 需要知道 python 二进制文件在哪里(在 /usr/local/bin/python),这是执行位于 /home/Documents/SCRAPE_PYTHON/SCRAPE.py 的 python 脚本所必需的(&>> 用于定向输出到日志文件)。

【讨论】:

    【解决方案3】:

    让我一一回答你所有的问题!

    1.) #!/usr/local/bin/python 语句在这种情况下的意义是什么?

    • 因此,这称为 Shebang,用于在此处指定您指向 python 解释器的解释器。 您可以阻止这种情况,但如果您阻止这种情况,则必须在运行脚本时指定解释器。

    #!/bin/bash 类似地指出 bash 解释器。 & shebang 必须是脚本的第一行。

    2) 是否需要创建一个 shell 文件来运行 Python/Scrapy 脚本等?

    • Nup 可以直接在 crontab 中输入命令。

    3) 你真的可以export PATH 并直接在 crontab -e 中执行其他命令(即cd ... && scrapy crawl mycrawler)吗?

    • 如果你这样做,这将是一个很好的做法,而且它也减少了行,因为如果你不使用PATH,那么你必须每次指定要执行的命令的完整路径,如/usr/bin/find运行find 命令。

    4) 第一条路径/usr/local/bin/python的意义是什么?

    • 正如我之前所说,它指向您的口译员。

    5) 在他的回答中,他指出&>> /home/Desktop/log.txt 是附加错误和其他输出的文件。 &>> 是这样做的吗?这对每个 Linux 发行版都通用吗?

    • &>> 会将输出添加到 stdout 文件中,是的,这对所有 linux 发行版都很常见。

    6) 服务器上是否有特定位置通常存储此类 shell 脚本?

    • 嗯,将脚本存储在哪里取决于您。但建议您将脚本存储在安全的地方,例如 /opt/<user>/scripts 文件夹中。

    可选

    https://crontab.guru/ - 在这里你可以了解更多关于 crontab 的语法,其他的都是 Linux 的基本东西。

    【讨论】:

    • 您涵盖了其他两个答案中尚未涵盖的内容?
    • 是的,我在发布我的答案后看到了它。!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2014-01-02
    • 2017-05-24
    • 2015-10-05
    • 2016-06-17
    • 2019-08-13
    相关资源
    最近更新 更多