Cron Job语法

时间:2018-07-02 02:18:28

标签: python linux bash cron

我以前从未创建过cron工作,也从未使用过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

  • 上面的代码为什么不包含两个路径?

  • 将外壳程序脚本放置在/home/user/scripts目录中是否是潜在的安全漏洞?

  • 是否存在一个特定的目录,通常会存储这样的shell脚本?


示例#4

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

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


为什么crontab个建议之间的所有差异?

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

3 个答案:

答案 0 :(得分:0)

这里有很多问题:

Cron作业或Cron时间表是一组特定的执行指令,用于指定要执行的日期,时间和命令。 crontab可以有多个执行语句。而且每个执行语句可以有许多命令(即每行)。

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

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

为什么将其注释掉?

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

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

关于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脚本所必需的(&>>用于定向输出到日志文件)。

答案 1 :(得分:0)

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

  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有意义(类似于{{3 }}。

shebang回答了您的问题:

  

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

答案是否定的。 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

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

&>>会将>>stdoutstderr)上命令的输出(&)附加到文件{{1} }。此日志记录很好,每5分钟可能很好,但是/home/Desktop/log.txt bash`语法因此可以与每个命令一起使用。

示例#3

python bits are not necessary. To answer your second question: yes this is

这将在每月的每个月的每一天的每一小时的*/2 * * * * /home/user/shell_scripts/cj-scrapy.sh 第{min}分钟执行一次程序/home/user/shell_scripts/cj-scraph.sh(大概是shell脚本)。该脚本大概可以运行您的python脚本。

示例4

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

答案 2 :(得分:0)

让我一个个回答您所有的问题!

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

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

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

2)创建运行Python / Scrapy脚本等所需的shell文件吗?

  • 不,您可以直接在crontab中输入命令。

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

  • 如果这样做,将是一个很好的做法,它还会减少行数,因为如果不使用PATH,则每次都要指定要执行的命令的完整路径,例如{{1 }}即可运行/usr/bin/find命令。

4)第一条路径find的意义是什么?

    就像我之前说的,它指向您的口译员。

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

  • &>>将输出绑定到文件&>>,是的,这对于所有Linux发行版都是常见的。

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

  • 好吧,这取决于您存储脚本的位置。但是建议您将脚本存储在stdout文件夹等安全的地方。

可选

/opt/<user>/scripts-在这里您可以了解有关crontab语法的更多信息,所有其他内容都是基本的Linux内容。