Linux学习笔记之十二(其实是13)(计划任务和日志管理)

一次性调度at

以前只是粗略地学过at,而且还有一些严重的错误认识,以下面的为主。

 

at就像是我们定的一次性闹铃,这个at需要我们安装一下,并且需要保证atd进程是running的。最后一句systemctl enable atd这句是设为开机自启的,可以不要的。

简单man一些at看看。

 

atq可以看计划任务的列表。

 

如果用的是at now +时间这种写法,后面的时间最小是一分钟。当然还有其它格式。

扫描二维码关注公众号,回复: 2731842 查看本文章

 

 

我们先安一下mail,虽然你们装过了,但是我没有,毕竟我重装了虚拟机系统。一个yum -y install mailx其实就够了,以前我查资料的时候好像复杂一点,这次我试了下,这样就够了。

我们来举个例子。

 

首先这个job不是我们以前讲过的作业,它是一个计划任务,job确实也可以翻译为任务。然后我们atq确实可以看到这个计划任务,编号是1,然后执行时间也有,最后的结果呢,默认是发邮件。

 

当然我们可以通过重定向到文件里,这样就不会发邮件了。但是重定向的方式别搞错,不是下面这样。

 

 

应该是这样的,下面我用的是非交互的方式。这个第二行这种写法以前见过,现在复习与一下,那两个引号是再esc下面的反引号,表示是把里面的date +%F命令先执行,然后在touch。于是乎,这个文件的名字应该是一种时间格式。

 

 

看到都是ok的。如果我们停掉atd呢,看到这个任务10居然还在atq里面,但是确实报错了,这个计划任务会执行吗?

 

答案是没有执行,然后我们开启atd之后,这个计划任务会立即执行。

循环计划任务cron

cron的计划任务分为用户级和系统级。一般用的都是用户级的。首先我们要保证crond在运行着。

用户级

一般这个crond都是开机自启enabled的。

一般这个crond都是开机自启enabled的。crond不是每时每刻都在查询是否有计划任务的(何况计算机也不可能),它是每分钟查询一次。

 

计划任务的存储位置在/var/spool/cron里面。创建,列出,删除计划任务分别是crontab -e,-l,-r。还有一个计划任务黑名单,就是/etc/cron.deny。在这里面的用户是无法创建计划任务的。

 

crontab -e打开文件之后,我们该怎么写呢?上面是格式,下面是例子。sunday比较特殊,因为有些国家是把周日作为一星期的开始,所以0和7都代表的是星期天。需要说明的是当天和星期同时出现的时候,是或的关系,下面图种也有解释。当然下图种的00,02这种的前面的0可以不要。

 

我们就来写一个计划任务看一看。

 

由于我是root用户,我是可以指定用户的,所以我指定了一个lcl用户,就是以这个用户来运行命令。

 

看lcl里面确实一堆邮件,

 

 

 

这些时间相隔一分钟。另外我们还可以动态查看这个日志文件/var/log/cron。这个日志文件记录着关于crond的信息,无论是-e,-l,还是-r,都会记录在案。

 

如果我们把lcl加入黑名单呢?看到不行。因为这就像泼出去的水,收不回来了。

 

那怎么办呢?我们先把计划任务删除,然后再试一次。删除任务可以用两种,一种是正常的-r,一种是暴力的rm删除。

 

这种删除在日志里会有记录。还有,计划任务没有办法用输入重定向的。

 

首先看到虽然lcl在黑名单里,但是还是可以创建这个计划任务,这是因为我们是以root在安排任务,root为所欲为啊。为什么useradd没有找到?这个命令肯定没有打错,是因为-u lcl了吗?看来不是的。

 

 

那么可能是计划任务是无法执行这样的命令的。从上面我们至少可以看出一点,就是cron只管执行命令,命令有没有错不管,cron就是到点执行一下命令而已,对不对它不关心,这就像大学里面的现状,老师只管点名,你来了就行,至于你学没学,那老师不管。但是我还没有验证-u lcl的意义何在。

 

 

看到有邮件说没有权限,那么如果是root呢?

 

这才有对比嘛,不然-u的意义何在。

 

 

暴力删除在日志种不会有记录。下面我们切到lcl试一下,因为它在黑名单里面嘛。

 

 

上面两张图还是主要说明crond对cron计划任务的必要性,还有cron的任务并不会在crond重启之后立即执行,还是遵循原来的计划的时间。如果你比较细心的话,可能会发现其实at里面也有猫腻。为什么任务的预定执行时间都是整分的,后面的秒居然都是0,不可能都是巧合吧。

 

为什么写进文件显示的不是整分呢,因为写磁盘需要时间嘛。看来at一般设定的任务都会在整分执行。而cron好像并不一定是整分执行的。

 

不过01确实和00很接近,也许crond查询是否有任务需要执行的时间就是00。不过其实对于我们一般的用途来说,1分钟以内的误差都是可以接受的。cron计划任务一般也就是用于备份数据,差个一分钟也不会有什么太大影响。

系统级别

用户级别和系统级别其实并没有明显的界限,因为linux是开源的啊,你可以改变设置,不像windows,但是一般来说上面的用户级别的就够用了。但我们还是来了解一下系统级别的任务,我们就不演示了,只是介绍知识。

 

系统级别的主要干一些什么事情呢?上图列出了三条。临时文件清理,系统信息菜鸡,日志切割(日志为什么要切割?因为它越来越大了啊)。系统级别的计划一般有两个位置存。一个是/etc/crontab。

 

这里面多了一个user-name,因为用户级我们都是用的是crontab -e以当前身份来打开vim来编辑的,在root用户下可以用-u指定执行计划任务的用户。用而这个需要我们直接vim /etc/crontab写入,所以需要一个user-name也可以理解。你可以往这里面写计划任务,不过不建议这么写。但是我们还是写一个看看。

 

写在/etc/crontab里面的不会在crontab -l里面显示,但是日志里面还是有记录的。

 

 

另外一种系统级别计划任务的方式和前面的不一样了,前面的都是什么情况呢,错过就不会再执行了,比如本来今天早上八点要date一下,但是九点才开机,那就不会有任何补救措施,上面停掉crond然后在开启中间都没有执行date可以显示这一点。但是下面会看到,这种方式是会有补救的。先来看一个文件/etc/cron.d/0hourly。

 

run-parts这个关键字的意思是运行后面文件夹里面的所有脚本。也就是说每到01分的时候就执行/etc.cron.hourly/里面的所有脚本。而这个文件夹下只有一个脚本,0anacron。

 

上面有一些脚本我们看不懂,我们重点关注最后一行/usr/sbin/anacron -s。意思就是运行这个命令。也就是说每个小时的01分都会运行anacron一次。这个anacron是干什么的呢?

 

anacron就是解决如果有计划任务没有按计划完成的问题的。首先anacron有一个配置文件/etc/anacrontab。

 

这面有一个表格,里面有这么几列,周期(单位是天),延迟时间,任务标识,命令。

第一行周期是1天,任务标识是cron.daily,nice是前面曾经有讲过的调增进程的优先级的一个东西,默认是+10,要执行的是/etc/daily里面的脚本,第二三行类比。先来学一下anacron补救的原理。首先呢,anacron有三个其实是存放校验时间的文件,/var/spool/anacron/cron.daily(weekly,monthly),这些时间是指上一次执行相应脚本的时间。

 

crond每个小时的01分调用一次anacron来检查时间,当然,肯定是开机,并且crond进程在运行才可以检查。如果检查的时候,当前的日期减去/var/spool/anacron/cron.daily里面的日期大于一天,那么5分钟后立即执行/etc/cron.daily里面的所有脚本(这个5就是上面的delay in minutes),如果小于,是不执行的。weekly和monthly也一是一样的道理,不过时间间隔变了,分别是7天和一个月。最后呢,我们看一下anacron是不是在每个小时的01分启动一次呢?在日志里面看。

确实是这样的,不过它很快就会结束。

日志管理

日志管理主要包括日志管理和日志的轮转(裁剪)。我们下面主要学习的还是日志管理。其中系统操作的日志是靠rsyslog软件来管理的,这个软件的进程叫做rsyslogd,它管理的包括sshd,su,at,cron等。r的意思是reliable,centos6里面这个软件的名字是syslog,可能7里面作了改进,所以加了一个r。

 

而apache(进程名是httpd),nginx,mysql都不是用rsyslogd来管理的,而是用自己的方式。看到在/var/log/里面都是有专门的文件夹的,这些文件夹是软件安装的时候自动配置的。

 

没有内容是因为我们并没有用httpd和nginx实现什么具体的功能,没有日志产生。

 

这个rsyslogd是开机自启的进程。

 

 

/var/log/messages是系统的主日志文件,绝大多数日志记录都在这里面,/var/log/secure里面主要是和认证,安全相关的,比如su,sshd。/var/log/maillog里面是邮件的记录,/var/log/cron里面是atd,crond产生的日志,crond我们已经看过了,/var/log/dmesg里面是和系统启动相关的记录,/var/log/yum.log里面是yum的记录,需要指出的是/var/log/mysql.log虽然在图上列出来了,但不一定存在,上面也提到过mysql的日志并不是由rsyslog来管理的,而是有自己的管理方法,上图只是想说明在配置日志文件的时候最好都放在/var/log里面。比较特殊的是wtmp,btmp,lastlog这三个,它们是二进制文件,读了会是一堆乱码。下面尝试读了一下,虽然不是乱码,但是最起码也是很难看懂的吧。这时候我们可以用命令查看,分别是w,last,lastlog。

 

 

 

这些never logged in表示它们从来没有登陆过。

 

 

不过atd的日志不会写入/var/log/cron里面,但也不在/var/log/messages里面,并不知道去哪了,也许根本就没有日志文件。

 

并且不是atd或者rsyslogd没有运行这个原因,那看来可能atd真的没有日志文件。下面是几个例子。

 

我们可以来打一遍,其中awk以前用过,NF是最后一列的意思NF-3就是倒数第四列。我们不解释了,直接看结果。

 

 

Fail的没有是因为我用的xshell自动登陆,并且我不是服务器也不是云主机,所以不会有人也不可能有人来登我的虚拟机,我也没有用花生壳,注意图中画的小括号。下面要说的是rsyslogd管理日志的原理。

 

首先是rsyslog的一个配置文件,它里面会告诉rsyslogd,什么设备的日志信息应该以什么级别放在什么地方。什么叫做设备(facility),什么叫做级别,这些后面都会讲到。先来说放在什么地方的问题,看到有的放在/var/log/secure有的放在-/var/log/maillog,这个-是什么意思呢?就是延缓写入硬盘,因为邮件的信息相比于其它系统日志来说没有那么重要,在一台主机作为邮件服务器的时候这个-就显得尤为重要,因为邮件的信息会有很多,会占用很多磁盘io资源而导致系统运行的日志不能及时写入硬盘,不能及时更新,可能会有严重后果,这时候把邮件的日志延缓写入,等系统日志写完了再考虑写入,这有点像坐火车,如果动车有急事,你高铁就,普通火车就得让道,动车过去了,你才能继续走,不过延缓写入的时候是存在内存里的,也不能太多,不然会挤爆内存,out of memory。*是所有终端的意思,下面的一个@后面加ip是存在远程主机上的,用的是UDP协议,不过前提是远程主机开启了准备接受日志的进程,还有防火墙配置好了,153端口开放。两个@@是TCP协议,前提类似,接受进程也要启动,也是153端口。

 

vim /etc/rsyslog.conf看一下。找到里面的rules。下面是默认的一些规则,我没有改过。

 

当然我们还看不懂,下面就先来学习设备,什么叫做设备呢?设备并不是指的是真的设备,而是一种软件类型而已,我才这是翻译的锅。下面是一些常见的设备类型。

 

除了设备还有级别,级别的意思就是应该记录多细节的信息,debug是最细的界别,就好比你踩死了一只鸟,系统会问你在哪里踩死的,在什么时候踩死的,为什么要踩死,用哪只脚踩死的等等,这个一般不会用的,因为数据太多,日志文件很快就会很大。emerg就是遇到非常致命的事件才会记录日志,平常的时候不记录,日志占用空间比较小。LOCAL0-7是留给我们哦那过户自定义的设备类型。

 

就通过下面这张图,我们来日志管理的整个过程。

 

有一个用户比如说jack要启动某个程序,然后程序启动进程,进程可能会有一些日志需要记录,这时候就需要logger登场,logger把需要记录的信息和软件的设备信息还有级别设置信息发给rsyslogd,然后rsyslogd根据配置文件里面的规则写入日志。那么这里面的设备信息和级别设置信息是如何产生的呢?是开发人员在开发软件的时候就通过一个很重要的函数syslog()写好了的,也就是说它会规定sshd属于authpriv这类设备,su也是,然而mail是MAIL类型的,等等。另外,它还规定了那些信息是应该属于debug级别的,哪些是属于emerg级别的,等等,这其实是一个仁者见仁,智者见智的问题。比如说30度对于我来说可能就已经很热了,而对于你可能还好,走了一万米对于你可能就很累了,我可能就很轻松,当然这些应该还是会有一些基本的规范的。左边方框是开发人员做的事情,运维人员不去关心或者操控不了,但是也有例外,就像ssh是提供给你有配置文件的,里面可以改设备类型。右边则是为我们运维人员可以改变的。左边是产生日志的,右边是收集,记录日志的。上图中的atd我们保持怀疑态度。

 

再看这个配置文件里面的rules,是不是已经可以看懂了呢?第一列,小数点前的是设备类型,后面是级别,none就是不写入,*.info就是全部设备,标准级别,cron.*是所有级别,其实就是debug级别,它最详细了。第一行有点长,它的意思是除了mail,authpriv,cron设备的日志,其它的都写入/var/log/messages里面。我们注意到emerg级别是直接会打到全部终端上的。而且其实cron.emerg和*.emerg有没有重合呢?有,那么日志应该记录在哪个文件里面呢?答案是都记录。下面我们要先用logger来‘移花接木’,之所以称为‘移花接木’是因为进程并没有实际产生需要记录的数据,而是我们人为用logger产生的。

 

logger后面可以直接加信息,也可以加-p指定设备和等级,格式和/etc/rsyslog.conf里面的rules一样,都是设备.级别。

 

 

 

的确在终端上和/var/log/cron里面都有记录。

 

确实目前我开的中终端也都有running这个message。不过第二次由于没有指定设备,这个记录被记到/var/log/messages里面了。

 

/var/log/cron里面就没有。

 

logger -p不加设备名,默认就记录到/var/log/messages里面了。

 

我们最后来完成下面的几道题

 

作业1,我们需要去修改rsyslogd的配置文件,可以不把原来的那一条注释另加一条,因为上面看到是可以同时记录到多个文件里面去的,这个文件也不需要提前创建,如果有日志需要记录会自动创建的。

 

我们为什么没有/var/log/auth.log呢?因为我们还没有数据需要记录,我们可以su 一下或者再开一个会话。

 

还是不行啊,为什么呢?因为我们需要重启rsyslog,让它重新加载配置文件/etc/rsyslog.conf里面的规则。

 

由于没有注释原来的那一行,所以/var/log/secure里面也有。

作业二,我们需要改动sshd的设备类型,还要改rsyslog的配置文件,所以sshd和rsyslog都需要重启。sshd的配置文件是/etc/ssh/sshd_config,找到syslogfacillity。

首先要说明,不是可以改成所有的设备类型的,MAIL没有变色,保存了也会出问题。

 

我就不演示会有什么问题了,正常的关键字是会变色的。

 

然后改动/etc/rsyslog.conf。

 

我们打开一个会话。

 

local5.local就有了。

作业三已经讲过了。

猜你喜欢

转载自blog.csdn.net/qq_41740705/article/details/81159258