Ubuntu的计划任务
2019-06-02 14:11:30

因为最近倒腾着Ubuntu,但是想着每天都要执行:

1
2
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的任务

开始踩坑填坑之路。。

第一步,新建自己的任务文件。

1
crontab -e

一开始会让你选择编辑器,我选了nano,因为它提示最简单:)

然后看着这个文件,有点头大,然后去找谷歌问了一下。

一条具体任务的格式是这样的:

分钟 小时 日期 月份 周几 命令

字段 描述 允许的值
分钟 一小时内的第几分 0-59
小时 一天里的第几个小时 0-23
日期 一个月的第几天 1-31
月份 一年的第几个月 1-12
周几 一周的第几天 0-7(0和7都是星期天)
命令 命令 任何可以被执行的命令

举一个例子:我想在每天早上10点钟的和晚上10点钟的时候执行updateupgrade命令

1
2
0 10,22 * * * sudo apt update
1 10,22 * * * sudo apt upgrade

其中每个字段用空格隔开,然后为了两个命令的先后顺序,一个设置了0分的时候,一个设置了1分的时候。

逗号隔开的时间都会执行该任务,也就是10点和22点的时候,任务都会执行。

*表示每天或者每小时,每个月都会执行

现在来查看我的计划任务创建了没,用命令crontab -l

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
▶ 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权限,如:

1
sudo crontab -e

将其中的任务改成:

1
2
0 10,22 * * * apt update
1 10,22 * * * apt upgrade

这是安全保险的一种方法。

不推荐的做法:

在crontab里面执行sudo命令。

注释/etc/sudoersDefaults requiretty这一行。

因为sudo默认需要tty终端,而crontab里的命令实际是以无tty形式执行的。

这么做,你的密码会以明文的形式存在在文件中,这将存在安全隐患。

1
@hourly echo “password” | sudo -S apt update

这里再提一下,如何查看日志

可以直接

1
sudo service cron status

查看最近的几条日志信息。

另一种方式,查看/var/log/syslog文件,这里面包含了系统里面的(应该是所有的)日志吧(还没研究过)

如果想只看crontab的日志,可以用一下命令

1
grep CRON /var/log/syslog

最后一定要记得

一定要记得

记得

1
sudo service cron start

参考

Linux 计划任务之crontab

Linux crontab下关于使用date命令和sudo命令的坑

Linux之crontab定时任务

如何查看crontab的日志记录

How to run a cron job using the sudo command

Where is the cron / crontab log?