因为最近倒腾着Ubuntu,但是想着每天都要执行:
1 | sudo apt update |
来更新自己的软件,就有点烦。而且经常忘记。所以这个时候就发现了Crontab这种好用的软件。(懒癌患者救星)
crontab相关文件的位置
/var/spool/cron/crontabs
:存放着每个用户的crontab任务,各个文件以用户名命名。/etc
:存放着不同重复时间的计划任务的目录(如cron.daily
,cron.weekly
,每个目录下存放要执行的crontab文件或者脚本。
crontab基本命令
crontab -e
:编辑当前用户的crontab任务,当该用户不存在crontab任务时新建一个文件crontab -l
:列出当前用户的crontab任务。crontab -r
:删除当前用户的crontab任务文件。crontab -u <user>
:指定某一用户的crontab任务文件。
新建自己的计划任务
我想着怎么新建一个自动执行sudo apt update
的任务
开始踩坑填坑之路。。
第一步,新建自己的任务文件。
1 | crontab -e |
一开始会让你选择编辑器,我选了nano,因为它提示最简单:)
然后看着这个文件,有点头大,然后去找谷歌问了一下。
一条具体任务的格式是这样的:
分钟 小时 日期 月份 周几 命令
字段 | 描述 | 允许的值 |
---|---|---|
分钟 | 一小时内的第几分 | 0-59 |
小时 | 一天里的第几个小时 | 0-23 |
日期 | 一个月的第几天 | 1-31 |
月份 | 一年的第几个月 | 1-12 |
周几 | 一周的第几天 | 0-7(0和7都是星期天) |
命令 | 命令 | 任何可以被执行的命令 |
举一个例子:我想在每天早上10点钟的和晚上10点钟的时候执行update
和upgrade
命令
1 | 0 10,22 * * * sudo apt update |
其中每个字段用空格隔开,然后为了两个命令的先后顺序,一个设置了0分的时候,一个设置了1分的时候。
用逗号隔开的时间都会执行该任务,也就是10点和22点的时候,任务都会执行。
*表示每天或者每小时,每个月都会执行
现在来查看我的计划任务创建了没,用命令crontab -l
1 | ▶ crontab -l |
说明已经创建成功了,但是在实际测试后,通过查看日志的方式发现这两条任务。。。
写的不对
写的不对
写的不对
因为在crontab里面直接执行sudo命令时无效的。
下面是强烈推荐:
想要在crontab里面执行root权限的命令,建议在创建任务时就使用root权限,如:
1 | sudo crontab -e |
将其中的任务改成:
1 | 0 10,22 * * * apt update |
这是安全保险的一种方法。
不推荐的做法:
在crontab里面执行sudo命令。
注释/etc/sudoers
的Defaults requiretty
这一行。
因为sudo默认需要tty终端,而crontab里的命令实际是以无tty形式执行的。
这么做,你的密码会以明文的形式存在在文件中,这将存在安全隐患。
1 | sudo -S apt update echo “password” | |
这里再提一下,如何查看日志
可以直接
1 | sudo service cron status |
查看最近的几条日志信息。
另一种方式,查看/var/log/syslog
文件,这里面包含了系统里面的(应该是所有的)日志吧(还没研究过)
如果想只看crontab的日志,可以用一下命令
1 | grep CRON /var/log/syslog |
最后一定要记得
一定要记得
记得
1 | sudo service cron start |
参考
Linux crontab下关于使用date命令和sudo命令的坑