问题描述
我想安排一项任务定期运行,并听说克朗是这样做的方式。
我如何在Ubuntu中添加Cron作业?
最佳解决方法
将shell脚本放在以下文件夹之一中:/etc/cron.daily
,/etc/cron.hourly
,/etc/cron.monthly
或/etc/cron.weekly
。
如果这些对您来说不够,您可以添加更多具体的任务,例如。每月两次或每隔5分钟或…进入终端并输入:
crontab -e
这将打开你的个人crontab(cron配置文件),该文件的第一行解释了这一切(你不觉得)!在每一行中,您都可以定义一个要运行的命令,并且当您掌握它时,格式非常简单。所以结构是:
minute hour day-of-month month day-of-week command
对于所有可以使用列表的数字,例如,第一个字段中的5,34,55
将表示在过去的34小时和55小时过去的时间内运行。
您也可以使用时间间隔,它们是这样定义的:*/20
这个例子意味着每隔20分钟,如果在分钟列中,这将等于0,20,40
所以要在下午5点30分的每个星期一运行一个命令:
30 17 * * 1 /path/to/command
或每15分钟一次
*/15 * * * * /path/to/command
请注意,day-of-week从0-6开始,其中0是星期日。
您可以阅读更多here。
次佳解决方法
如果您想运行的作业可以以与您的用户相同的权限运行,我推荐使用用户crontab,您可以通过运行EDITOR="gedit" crontab -e
(它将使用gedit编辑crontab文件)或者简单地使用crontab -e
(它将使用默认值编辑器)在终端中。
例如,如果您想每10分钟运行一次,请添加这样的一行
*/10 * * * * /usr/bin/somedirectory/somecommand
并保存该文件。
您可以使用crontab -l
查看用户crontab的内容。
最灵活的方法是使用系统crontab,您可以通过在终端中运行sudo crontab -e
来进行编辑。这将允许您以root用户身份运行您的命令(以防您需要该级别的权限)或系统上的任何其他用户。
然后,如果您想以root身份每10分钟运行一次,例如,您可以添加一行这样的行
*/10 * * * * root /usr/bin/somedirectory/somecommand
并保存该文件(注意用户添加到该行)
您可以使用sudo crontab -l
查看系统crontab文件的内容。
更多细节请参阅:https://help.ubuntu.com/community/CronHowto
第三种解决方法
如果您更喜欢使用GUI执行此操作,则可以转至软件中心并安装预定任务(或者运行sudo apt-get install gnome-schedule
)。它将提供强大的GUI来添加cron任务。
请注意,如果您使用此方法,默认情况下的任务将作为您自己的用户执行,而不是作为根用户执行。这通常是一件好事。
第四种方法
我推荐KDE的任务计划程序(kde-config-cron
)。从那里的任务计划程序模块的系统设置中访问它。
它同时管理个人和系统Crontabs,并且创建时间界限的方便性让我大吃一惊(参见下面的截图)。我认为这部分真的被低估了。
第五种方法
KDE Task Scheduler在常规的Ubuntu中不起作用。它只适用于像KUbuntu这样的KDE系统。对于非KDE系统,您更愿意使用gnome-schedule
$ sudo apt-get install gnome-schedule
该应用程序是Dash中的计划任务。
第六种方法
我想设置一个Cron作业来运行bash脚本,因此执行脚本会添加一个cron作业。
我意识到,当你使用:
crontab -e
然后它创建该文件:
/var/spool/cron/crontabs/root
其中root是运行crontab命令的用户的名称。所以基于这一点,至少在14.04,我们可以执行下面的bash命令来创建一个新的Cron作业:
echo "30 17 * * 1 /path/to/command" > /var/spool/cron/crontabs/root
我们还需要为文件设置正确的所有权:
chown root:root /var/spool/cron/crontabs/root
并设置正确的权限:
chmod 600 /var/spool/cron/crontabs/root
如果在运行crontab -e
时列表中已经存在Cron作业,则可以使用以下命令追加到列表中:
echo "30 17 * * 1 /path/to/command" >> /var/spool/cron/crontabs/root