# 计划任务 - 计划任务主要是做一些周期性的任务,可以让某个任务按照我们的预期的时间或计划去执行。 ## 单次调度执行at 安装at软件包: `yum install -y at` 启动at服务: ```bash [root@localhost ~]# systemctl start atd [root@localhost ~]# systemctl enable atd # 开机自启动 ``` ### 语法结构 `at [options] time` #### 选项: - -f:指定包含具体指令的任务文件 - -q:指定新任务的队列名称 - -l:显示待执行任务的列表 - -d:删除指定的待执行任务 - -c:根据序号查看具体任务的内容 或者也可以使用一下命令查看和删除 `atq`:查看待执行的任务 `atrm`:通过序号删除任务 #### timespec ```bash at now +5min # 从现在开始5分钟后 at teatime tomorrow # 明天的下午16:00 at noon +4 days # 4天后的中午 at 11:20 AM # 早上11:20 ..... ..... # 对于at任务的时间写法有很多,不需要记忆,用到的时候查询一下就行 ``` **示例一:**5分钟后创建一个文件 ```bash [root@localhost ~]# at now +5min at> touch /root/file2 at> # ctrl+D 结束任务编辑 job 1 at Fri May 31 21:03:00 2024 [root@localhost ~]# at -l # 查看任务 1 Fri May 31 21:03:00 2024 a root ``` **示例二:**通过文件指定任务 ```bash [root@localhost ~]# vim at.jobs useradd testuser [root@localhost ~]# at -l [root@localhost ~]# at now +5min -f at.jobs job 2 at Fri May 31 21:03:00 2024 [root@localhost ~]# at -l 2 Fri May 31 21:03:00 2024 a root ``` ## 循环调度执行cron 计划任务(Cron)是一种强大的工具,可以自动执行预定的任务。它非常适合定期运行脚本、备份数据、清理临时文件等一系列重复性任务。 crontab:是cron服务提供的管理工具 **检查cron服务有没有启动:** ```bash [root@localhost ~]# systemctl status crond.service ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since 五 2024-05-31 21:30:35 CST; 3min 48s ago Main PID: 6225 (crond) CGroup: /system.slice/crond.service └─6225 /usr/sbin/crond -n 5月 31 21:30:35 localhost.localdomain systemd[1]: Started Command Scheduler. 5月 31 21:30:36 localhost.localdomain crond[6225]: (CRON) INFO (RANDOM_DELAY... 5月 31 21:30:36 localhost.localdomain crond[6225]: (CRON) INFO (running with... Hint: Some lines were ellipsized, use -l to show in full. # 启动 systemctl start crond.service ``` cron计划任务主要分为用户的任务和系统任务,用户任务是又具体某个用户编写的任务,而系统任务则在系统启动时始终生效 ### cron的基本语法 cron命令的基本语法如下: ```text crontab [-l | -r | -e | -n | -m] ``` #### 选项: - `-l`:列出当前用户的定时任务。 - `-r`:删除当前用户的定时任务。 - `-e`:编辑当前用户的定时任务。 - `-n`:检查定时任务是否可用。 - `-m`:发送类似于电子邮件的消息,用于通知定时任务执行的结果。 ```bash [root@localhost ~]# crontab -l # 列出当前用户所有计划任务 [root@localhost ~]# crontab -r # 删除当前用户计划任务 [root@localhost ~]# crontab -e # 编辑当前用户计划任务 管理员可以使用 -u username,去管理其他用户的计划任务 [root@localhost ~]# vi /etc/cron.deny # 这个文件中加入的用户名无法使用cron ``` ### cron任务的配置 每个用户可以通过`crontab`命令来编辑自己的任务计划。要编辑cron任务,可以使用`crontab -e`命令。 ### 编辑cron任务 要编辑cron任务计划,可以使用以下命令打开cron编辑器: ```bash crontab -e ``` ### 配置cron任务的格式 cron任务的格式如下: ```bash 分 时 日 月 星期 命令 * 表示任何数字都符合 0 2 * * * date >> date.txt # 每天的2点 0 2 14 * * date >> date.txt # 每月14号2点 0 2 14 2 * date >> date.txt # 每年2月14号2点 0 2 * * 5 date >> date.txt # 每个星期5的2点 0 2 * 6 5 date >> date.txt # 每年6月份的星期5的2点 0 2 2 * 5 date >> date.txt # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系 0 2 2 6 5 date >> date.txt # 每年6月2号或者星期5的2点 */5 * * * * date >> date.txt # 每隔5分钟执行一次 0 2 1,4,6 * * date >> date.txt # 每月1号,4号,6号的2点 0 2 5-9 * * date >> date.txt # 每月5-9号的2点 * * * * * date >> date.txt # 每分钟 0 * * * * date >> date.txt # 每整点 * * 2 * * date >> date.txt # 每月2号的每分钟 ``` 其中,第一个字段表示分钟(0-59),第二个字段表示小时(0-23),第三个字段表示天(1-31),第四个字段表示月份(1-12),第五个字段表示星期(0-7)。第六个字段是要执行的命令或脚本。 例如,要每天上午10点重启系统,可以配置如下: ```bash 0 10 * * * reboot ``` 在线crontab测试网站: ### 查看任务存放位置 `/var/spool/cron/root` ```bash [root@localhost ~]# cat /var/spool/cron/root * * * * * date >> file.txt ``` ### 示例 这里列举几个常见的cron任务的示例: 1. 每天凌晨3点备份文件: ```text 0 3 * * * /path/to/backup.sh ``` 2. 每周一上午8点清理临时文件: ```text 0 8 * * 1 /path/to/cleanup.sh ``` 3. 每隔10分钟检查服务器状态: ```text */10 * * * * /path/to/check_status.sh ``` ## cron系统任务 - 临时文件的清理`/tmp` `/var/tmp` - 系统信息的采集 `sar` - 日志的轮转(切割) `lgrotate` - 通常不是由用户定义 - 文件的位置 ```bash [root@localhost ~]# vim /etc/crontab # 默认没有定义任何计划任务 [root@localhost ~]# ls /etc/cron.d # 定义的计划任务每个小时会执行 0hourly sysstat [root@localhost ~]# cat /etc/cron.d/0hourly # Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly # 每小时01分以root身份执行/etc/cron.hourly/目录下的所有脚本 ``` - `crond`仅仅会执行每小时定义的脚本 `/etc/cron.hourly` ```bash [root@localhost ~]# ls /etc/cron.hourly/ [root@localhost ~]# cat /etc/cron.hourly/0anacron /usr/sbin/anacron -s # anacron是用来检查是否有错过的计划任务需要被执行 [root@localhost ~]# vi /etc/anacrontab 1 5 cron.daily nice run-parts /etc/cron.daily #每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行 7 25 cron.weekly nice run-parts /etc/cron.weekly #每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行 ©monthly 45 cron.monthly nice run-parts /etc/cron.monthly #每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行 ``` # 日志管理 Linux系统和许多程序会产生各种错误信息、告警信息和其他的提示信息,这些各种信息都应该记录到日志文件中。Linux系统日志对管理员来说,是了解系统运行的主要途径,因此需要对Linux日志系统有详细的了解。 ## 常见的日志文件 | 日志文件 | 解释 | | :-----------------: | :-------------------------------------------------: | | /var/log/messages | 系统主日志文件 | | /var/log/secure | 记录认证、安全的日志 | | /var/log/maillog | 跟邮件postfix相关 | | /var/log/cron | crond、at进程产生的日志 | | /var/log/dmesg | 记录系统启动时加载的硬件相关信息日志 | | /var/log/yum.log | yum的日志 | | /var/log/mysqld.log | MySQL日志 | | var/log/xferlog | 和访问FTP服务器相关 | | /var/log/boot.log | 系统启动过程日志记录存放 | | /var/log/wtmp | 当前登录的用户(可以直接在命令行输入w查看) | | /var/log/lastlog | 所有用户的登录情况(可以直接在命令行输入lastlog查看) | ## 查看日志 有多种方法可以查看日志,可以通过cat、tail等命令来查看 但是往往日志文件中内容都是非常多的,所以对于初学者通过cat查看不是很直观。这个时候我们可以配合一些其他过滤工具来过滤日志里面的内容。如:grep,awk等等。 ### 示例一:查看message日志中关于ens160网卡的信息 ```bash [root@localhost ~]# cat /var/log/messages | grep ens160 # 通过grep来过滤出跟ens160相关的内容 [root@localhost ~]# cat /var/log/messages | grep ens160 Nov 9 11:13:20 localhost kernel: vmxnet3 0000:03:00.0 ens160: renamed from eth0 Nov 9 11:13:24 localhost NetworkManager[785]: [1731122004.5476] manager: (ens160): new Ethernet device (/org/freedesktop/NetworkManager/Devices/2) Nov 9 11:13:24 localhost NetworkManager[785]: [1731122004.5482] device (ens160): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external') Nov 9 11:13:24 localhost kernel: vmxnet3 0000:03:00.0 ens160: intr type 3, mode 0, 5 vectors allocated Nov 9 11:13:24 localhost kernel: vmxnet3 0000:03:00.0 ens160: NIC Link is Up 10000 Mbps Nov 9 11:13:24 localhost NetworkManager[785]: [1731122004.5604] device (ens160): carrier: link connected ``` ### 示例二:统计远程登录信息 ```bash [root@localhost ~]# cat /var/log/secure | grep Accepted Nov 9 14:14:19 localhost sshd[4953]: Accepted password for root from 192.168.88.1 port 57324 ssh2 Nov 28 11:44:38 localhost sshd[1523]: Accepted password for root from 192.168.88.1 port 1665 ssh2 Nov 28 11:44:38 localhost sshd[1525]: Accepted password for root from 192.168.88.1 port 1666 ssh2 Nov 28 13:39:50 localhost sshd[1514]: Accepted password for root from 192.168.88.1 port 3682 ssh2 ``` ### 示例三:查看用户与用户组相关的信息 ```bash [root@localhost ~]# cat /var/log/secure | grep useradd May 30 11:09:15 localhost useradd[7762]: new group: name=user1, GID=1001 May 30 11:09:15 localhost useradd[7762]: new user: name=user1, UID=1001, GID=1001, home=/home/user1, shell=/bin/bash May 30 11:09:18 localhost useradd[7767]: new group: name=user2, GID=1002 May 30 11:09:18 localhost useradd[7767]: new user: name=user2, UID=1002, GID=1002, home=/home/user2, shell=/bin/bash [root@localhost ~]# cat /var/log/secure | grep groupadd May 30 11:09:29 localhost groupadd[7772]: group added to /etc/group: name=IT, GID=1003 May 30 11:09:29 localhost groupadd[7772]: group added to /etc/gshadow: name=IT May 30 11:09:29 localhost groupadd[7772]: new group: name=IT, GID=1003 ``` ### 示例四:查看计划任务cron相关 ```bash [root@localhost ~]# cat /var/log/cron May 30 10:15:01 localhost run-parts(/etc/cron.daily)[7516]: finished logrotate May 30 10:15:01 localhost run-parts(/etc/cron.daily)[7504]: starting man-db.cron May 30 10:15:01 localhost run-parts(/etc/cron.daily)[7715]: finished man-db.cron May 30 10:15:01 localhost anacron[7492]: Job `cron.daily' terminated May 30 10:35:01 localhost anacron[7492]: Job `cron.weekly' started May 30 10:35:01 localhost anacron[7492]: Job `cron.weekly' terminated May 30 10:55:01 localhost anacron[7492]: Job `cron.monthly' started May 30 10:55:01 localhost anacron[7492]: Job `cron.monthly' terminated May 30 10:55:01 localhost anacron[7492]: Normal exit (3 jobs run) May 30 11:01:01 localhost CROND[7741]: (root) CMD (run-parts /etc/cron.hourly) May 30 11:01:01 localhost run-parts(/etc/cron.hourly)[7741]: starting 0anacron May 30 11:01:01 localhost run-parts(/etc/cron.hourly)[7750]: finished 0anacron ``` ## 日志系统-rsyslogd ### 处理日志的进程 `rsyslogd`:绝大部分日志记录,和系统操作有关,安全,认证`sshd,su`,计划任务`at,cron` `httpd/nginx/mysql`等等应用可以以自己的方式记录日志 ```bash [root@localhost ~]# ps aux |grep rsyslogd root 6808 0.0 0.2 216408 5016 ? Ssl 09:32 0:00 /usr/sbin/rsyslogd -n root 7724 0.0 0.0 112724 988 pts/0 S+ 10:39 0:00 grep --color=auto rsyslogd ``` 日志可以存放在本地 日志可以存放在远程服务器 ### 配置文件 ```bash [root@localhost ~]# rpm -qc rsyslog /etc/logrotate.d/syslog # 日志轮转(切割)相关 /etc/rsyslog.conf # rsyslogd的主配置文件 /etc/sysconfig/rsyslog # rsyslogd相关文件 ``` ```bash [root@localhost ~]# vim /etc/rsyslog.conf # 告诉rsyslogd进程 哪个设备(facility),关于哪个级别的信息,以及如何处理 authpriv.* /var/log/secure mail.* /var/log/maillog cron.* /var/log/cron *.emerg :omusrmsg:* authpriv.* * # 所有终端 authpriv.* @192.168.1.123 # UDP authpriv.* @@192.168.1.123 # TCP ``` ### 日志类型(facility) | 序号 | Facility | 解释 | | :---: | :-----------: | :--------------------------------------------------------: | | 0 | kern (kernel) | Linux内核产生的信息,大部分是硬件检测和内核功能的启用 | | 1 | user | 用户层级产生的信息 | | 2 | mail | 所有邮件收发的相关信息 | | 3 | daemon | 系统服务产生的信息 | | 4 | auth | 与认证、授权相关的信息,如`login`、`ssh`、`su`等产生的信息 | | 5 | syslog | `syslogd`服务产生的信息 | | 6 | lpr | 打印相关的信息 | | 7 | news | 新闻群组相关的信息 | | 8 | uucp | Unix to Unix Copy Protocol 早期Unix系统间的数据交换协议 | | 9 | cron | 周期性计划任务程序,如`cron`、`at`等产生的信息 | | 10 | authpriv | 与auth类似,但记录的多为帐号相关的信息,如pam模块的调用等 | | 16~23 | local0~local7 | 保留给本地用户使用的日志类型,通常与终端交互相关。 | **日志级别** | 级别(日志重要级别) | 解释 | | :----------------: | :------------------------------------------: | | LOG_EMERG | 紧急,致命,服务无法继续运行,如配置文件丢失 | | LOG_ALERT | 报警,需要立即处理,如磁盘空间使用95% | | LOG_CRIT | 致命行为 | | LOG_ERR(error) | 错误行为 | | LOG_WARNING | 警告信息 | | LOG_NOTICE | 普通 | | LOG_INFO | 标准信息 | | LOG_DEBUG | 调试信息,排错才开,一般不建议使用 | ### 案例:远程管理日志 **环境准备:**两台服务器,其中server1模仿生产服务器,server2做为日志服务器。 **实验要求:**server1和server2可以通信(建议两边的虚拟网卡都调整成NAT模式) **实验目的:**通过配置rsyslog,使得server1上关于ssh连接的日志发送到server2日志服务器上保存,在server2上可以查看到server1上的ssh日志 **注意关闭server1和server2上的firewalld!!** `systemctl stop firewalld` **server1上配置:** 1. 编辑`/etc/rsyslog.conf`文件 ```bash # 在最下面添加如下字段 [root@localhost ~]# vim /etc/rsyslog.conf :msg,contains,"sshd" @192.168.88.20:514 #=====字典解释===== - msg 要发送的消息 - contains,"sshd" 过滤器,过滤所有跟sshd有关的日志 - @192.168.88.20:514 要发送到日志服务器的地址,其中@表示UDP,@@表示TCP ``` 2. 重启rsyslog服务 ```bash [root@localhost ~]# systemctl restart rsyslog ``` **server2上配置:** 修改配置文件 ```bash [root@localhost ~]# vim /etc/rsyslog.conf # Provides UDP syslog reception # 在配置文件中下入下面几行 # 加载imudp模块,启用对UDP网络接口的支持 $ModLoad imudp $UDPServerRun 514 $ModLoad imtcp $InputTCPServerRun 514 :msg,contains,"sshd" /var/log/remote_ssh.log # 任意位置添加规则, # 重启rsyslog服务 [root@localhost ~]# systemctl restart rsyslog ``` **测试:** 通过MobaXterm远程连接server1 通过`tail -f /var/log/remote_ssh.log`来实时检测是否又日志记录发过来 ## 日志文件归档 如果我们不管理系统产生的上述各种日志文件,那么久而久之日志就会变成“屎山”。日志文件及内容越堆越多,不仅难以查阅,还会因为单一文件过大而影响新的内容写入的效率 `logrotate`就是一个不错的日志处理程序,准确的说是对日志进行“归档”之类的工作 ## logrotate(日志轮转) - 如果没有日志轮转,日志文件会越来越大 - 将丢弃系统中最旧的日志文件,以节省空间 - 事实上`logrotate`是挂在`cron`配置目录`cron.daily`下面的,所以会被`cron`每天执行一次: ```bash [root@localhost ~]# ll /etc/cron.daily/ -rwx------. 1 root root 219 10月 31 2018 logrotate -rwxr-xr-x. 1 root root 618 10月 30 2018 man-db.cron # 查看logrotate内容 [root@localhost ~]# cat /etc/cron.daily/logrotate #!/bin/sh /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf # 日志轮转状态/var/lib/logrotate/logrotate.status # 日志轮转规则按照/etc/logrotate.conf中来 ``` - logrotate主配置文件 ```bash [root@localhost ~]# vim /etc/logrotate.conf weekly # 多久会执行一次“轮转”,这里设置的是每周一次 rotate 4 # 轮转后会保留几个历史日志文件,这里是4,也就是说轮转后会删除编号为5的历史日志 create # 轮转后创建新的空白日志 dateext # 使用日期而非数字编号作为历史日志的标识进行轮转 include /etc/logrotate.d # 加载/etc/logrotate.d目录下的配置文件 /var/log/wtmp { # 对/var/log/wtmp日志的特殊设置 monthly # 每月进行一次轮转 create 0664 root utmp # 创建的新的空白日志权限为0664,用户为root,用户组为utmp minsize 1M # 原始日志文件超过1M大小才进行轮转 rotate 1 # 仅保留1个历史日志文件 } /var/log/btmp { # 对/var/log/btmp日志的特殊设置 missingok # 日志轮转期间任何错误都会被忽略 monthly # 每月进行一次轮转 create 0600 root utmp # 创建的新日志文件权限为0600,用户为root,用户组为utmp rotate 1 # 仅保留1个历史日志文件 } ``` - 子配置文件 ```bash [root@localhost ~]# cat /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { missingok sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } ```