我以前从未创建过cron工作,也从未使用过cron工作,但是从SO的众多问题和答案中收集到的信息是该过程非常简单,涉及以下内容:
我在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
命令
对于这一部分,我看到了很多不同的建议,因此,我将从一些不同的答案中列出一些示例。
PATH=/usr/bin
* 5 * * * cd project_folder/project_name/ && scrapy crawl spider_name
crontab -e
中嵌入命令被认为是一种好习惯? */5 * * * * /usr/local/bin/python /home/Documents/SCRAPE_PYTHON/SCRAPE.py &>> /home/Desktop/log.txt
/usr/local/bin/python
的意义是什么?他在回答中指出&>> /home/Desktop/log.txt
是将附加错误和其他输出的文件。
&>>
是做什么的?
在每个Linux环境中通用吗?
*/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
的时间和日期部分的语法,但是有人可以解释一下其余部分的正确语法吗?
答案 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)
我尝试为您在下面的所有问题和示例提供上下文,但最终的问题是:
通常,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
使得此包装程序完全没有必要。
现在来看您的示例:
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是时间指令,后跟命令。
*/5 * * * * /usr/local/bin/python /home/Documents/SCRAPE_PYTHON/SCRAPE.py &>> /home/Desktop/log.txt
该命令将在每月的每一天的每一小时的第5
分钟中运行。这里的/usr/local/bin/python
与#!/usr/local/bin/python
是多余的,因此完全没有必要。
&>>
会将>>
和stdout
(stderr
)上命令的输出(&
)附加到文件{{1} }。此日志记录很好,每5分钟可能很好,但是/home/Desktop/log.txt
bash`语法因此可以与每个命令一起使用。
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脚本。
这既不是python也不是cron作业。
答案 2 :(得分:0)
让我一个个回答您所有的问题!
1。)在这种情况下,#!/usr/local/bin/python
语句的意义是什么?
类似#!/bin/bash
指出bash解释器。 &shebang一定是脚本的第一行。
2)创建运行Python / Scrapy脚本等所需的shell文件吗?
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内容。