因为最近倒腾着Ubuntu,但是想着每天都要执行:
sudo apt update
sudo apt upgrade
来更新自己的软件,就有点烦。而且经常忘记。所以这个时候就发现了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
的任务
开始踩坑填坑之路。。
第一步,新建自己的任务文件。
crontab -e
一开始会让你选择编辑器,我选了nano,因为它提示最简单:)
然后看着这个文件,有点头大,然后去找谷歌问了一下。
一条具体任务的格式是这样的:
分钟 小时 日期 月份 周几 命令
字段 | 描述 | 允许的值 |
---|---|---|
分钟 | 一小时内的第几分 | 0-59 |
小时 | 一天里的第几个小时 | 0-23 |
日期 | 一个月的第几天 | 1-31 |
月份 | 一年的第几个月 | 1-12 |
周几 | 一周的第几天 | 0-7(0和7都是星期天) |
命令 | 命令 | 任何可以被执行的命令 |
举一个例子:我想在每天早上10点钟的和晚上10点钟的时候执行update
和upgrade
命令
0 10,22 * * * sudo apt update
1 10,22 * * * sudo apt upgrade
其中每个字段用空格隔开,然后为了两个命令的先后顺序,一个设置了0分的时候,一个设置了1分的时候。
用逗号隔开的时间都会执行该任务,也就是10点和22点的时候,任务都会执行。
*表示每天或者每小时,每个月都会执行
现在来查看我的计划任务创建了没,用命令crontab -l
▶ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
0 10,22 * * * sudo apt update
1 10,22 * * * sudo apt upgrade
说明已经创建成功了,但是在实际测试后,通过查看日志的方式发现这两条任务。。。
写的不对
写的不对
写的不对
因为在crontab里面直接执行sudo命令时无效的。
下面是强烈推荐:
想要在crontab里面执行root权限的命令,建议在创建任务时就使用root权限,如:
sudo crontab -e
将其中的任务改成:
0 10,22 * * * apt update
1 10,22 * * * apt upgrade
这是安全保险的一种方法。
不推荐的做法:
在crontab里面执行sudo命令。
注释/etc/sudoers
的Defaults requiretty
这一行。
因为sudo默认需要tty终端,而crontab里的命令实际是以无tty形式执行的。
这么做,你的密码会以明文的形式存在在文件中,这将存在安全隐患。
@hourly echo “password” | sudo -S apt update
这里再提一下,如何查看日志
可以直接
sudo service cron status
查看最近的几条日志信息。
另一种方式,查看/var/log/syslog
文件,这里面包含了系统里面的(应该是所有的)日志吧(还没研究过)
如果想只看crontab的日志,可以用一下命令
grep CRON /var/log/syslog
最后一定要记得
一定要记得
记得
sudo service cron start
参考
Linux crontab下关于使用date命令和sudo命令的坑
网友评论