Cron作业语法

2024-04-25 00:50:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我发现了很多关于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

^{2}$
  • 直接在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的时间和日期部分的语法,但是有人能解释一下其余部分的正确语法吗?


Tags: 答案命令脚本bashhomebinusr作业
3条回答

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

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

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

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

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

  • 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的基本内容。在

我试着为下面所有的问题和例子提供背景,但最终的问题是:

  1. 您希望多长时间执行一次命令?在
  2. 你需要执行什么命令?在

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

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

在UNIX中,#!(或^{})指示应该使用哪个程序来解释下面的脚本。因此#!/usr/local/bin/python意味着用python(又名/usr/local/bin/python)执行下面的脚本,就像/bin/bash表示下面的脚本应该用bashshell执行一样。这看起来像一个注释,因为它是一个注释。。。它被设计成对python的注释,因此它不会被解释,但是它在执行时对UNIX有意义(类似于preprocessor directive)。在

shebang回答了您的问题:

Is using a shell script as a proxy even necessary to run Python scripts?

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

现在来看看你的例子:

示例:

^{pr2}$

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

Is embedding commands directly in crontab -e considered good practice?

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&)上的命令输出(>>)追加到文件/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

这将在一周中的每一天的每一小时的每一分钟执行程序/home/user/shell_scripts/cj-scraph.sh(大概是一个shell脚本)。这个脚本大概运行您的python脚本。在

例4

这既不是python也不是cron任务。在

这里有很多问题,但是:

Cron job或Cron schedule是一组特定的执行指令,指定要执行的日期、时间和命令。crontab可以有多个执行语句。每个执行语句可以有多个命令(即每行)。在

这有什么意义!/usr/bin/bash语句?在

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

为什么会被注释掉?在

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

使用shell脚本作为代理是运行Python脚本所必需的吗?在

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

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

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

^{pr2}$

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

相关问题 更多 >