计划任务

  • 计划任务主要是做一些周期性的任务,可以让某个任务按照我们的预期的时间或计划去执行。

单次调度执行at

安装at软件包:

yum install -y at

启动at服务:

[root@localhost ~]# systemctl start atd
[root@localhost ~]# systemctl enable atd        # 开机自启动

语法结构

at [options] time

选项:

  • -f:指定包含具体指令的任务文件
  • -q:指定新任务的队列名称
  • -l:显示待执行任务的列表
  • -d:删除指定的待执行任务

或者也可以使用一下命令查看和删除

atq:查看待执行的任务

atrm:通过序号删除任务

timespec

  now +5min            # 从现在开始5分钟后
  teatime tomorrow  # 明天的下午16:00
  noon +4 days        # 4天后的中午
  11:20 AM            # 早上11:20
  .....
  .....

# 对于at任务的时间写法有很多,不需要记忆,用到的时候查询一下就行

示例一:5分钟后创建一个文件

[root@localhost ~]# at now +5min
at> touch /root/file2
at> <EOT>            # 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

示例二:通过文件指定任务

[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服务有没有启动:

[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命令的基本语法如下:

crontab [-l | -r | -e | -n | -m]

选项:

  • -l:列出当前用户的定时任务。
  • -r:删除当前用户的定时任务。
  • -e:编辑当前用户的定时任务。
  • -n:检查定时任务是否可用。
  • -m:发送类似于电子邮件的消息,用于通知定时任务执行的结果。
[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编辑器:

crontab -e

配置cron任务的格式

cron任务的格式如下:

分 时 日 月 星期 命令
* 表示任何数字都符合
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点重启系统,可以配置如下:

0 10 * * * reboot

查看任务存放位置

/var/spool/cron/root

[root@localhost ~]# cat /var/spool/cron/root
* * * * * date >> file.txt

示例

这里列举几个常见的cron任务的示例:

  1. 每天凌晨3点备份文件:

    0 3 * * * /path/to/backup.sh
    
  2. 每周一上午8点清理临时文件:

    0 8 * * 1 /path/to/cleanup.sh
    
  3. 每隔10分钟检查服务器状态:

    */10 * * * * /path/to/check_status.sh
    

cron系统任务

  • 临时文件的清理/tmp /var/tmp
  • 系统信息的采集 sar
  • 日志的轮转(切割) lgrotate
  • 通常不是由用户定义
  • 文件的位置
[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
[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日志中关于ens33网卡的信息

[root@localhost ~]# cat /var/log/messages | grep ens33
# 通过grep来过滤出跟ens33相关的内容
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9969] dhcp4 (ens33):   address 192.168.88.136
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9970] dhcp4 (ens33):   plen 24 (255.255.255.0)
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9970] dhcp4 (ens33):   gateway 192.168.88.2
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9970] dhcp4 (ens33):   lease time 5185800
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9970] dhcp4 (ens33):   nameserver '192.168.88.2'
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9970] dhcp4 (ens33):   domain name 'localdomain'
May 30 09:55:47 localhost NetworkManager[6310]: <info>  [1717034147.9970] dhcp4 (ens33): state changed unknown -> bound

image-20240530104919682

示例二:统计远程登录信息

[root@localhost ~]# cat /var/log/secure-20240530 | grep Accepted
Apr 27 10:49:14 localhost sshd[16512]: Accepted password for root from 192.168.88.1 port 56801 ssh2
Apr 27 10:49:14 localhost sshd[16516]: Accepted password for root from 192.168.88.1 port 56818 ssh2
May 30 09:33:21 localhost sshd[7319]: Accepted password for root from 192.168.88.1 port 15675 ssh2
May 30 09:33:21 localhost sshd[7323]: Accepted password for root from 192.168.88.1 port 15676 ssh2

示例三:查看用户与用户组相关的信息

[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相关

[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等等应用可以以自己的方式记录日志

[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

日志可以存放在本地

日志可以存放在远程服务器

配置文件

[root@localhost ~]# rpm -qc rsyslog
/etc/logrotate.d/syslog        # 日志轮转(切割)相关
/etc/rsyslog.conf            # rsyslogd的主配置文件
/etc/sysconfig/rsyslog        # rsyslogd相关文件
[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 用户层级产生的信息,例如后边介绍的通过logger产生的日志信息
2 mail 所有邮件收发的相关信息
3 daemon 系统服务产生的信息
4 auth 与认证、授权相关的信息,如loginsshsu等产生的信息
5 syslog syslogd服务产生的信息
6 lpr 打印相关的信息
7 news 新闻群组相关的信息
8 uucp Unix to Unix Copy Protocol 早期Unix系统间的数据交换协议
9 cron 周期性计划任务程序,如cronat等产生的信息
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文件
# 在最下面添加如下字段
[root@localhost ~]# vim /etc/rsyslog.conf
:msg,contains,"sshd" @192.168.88.138:514

#=====字典解释=====
- msg 要发送的消息
- contains,"sshd" 过滤器,过滤所有跟sshd有关的日志
- @192.168.88.138:514  要发送到日志服务器的地址,其中@表示UDP,@@表示TCP
  1. 重启rsyslog服务
[root@localhost ~]# systemctl restart rsyslog

server2上配置:

修改配置文件

[root@localhost ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp                # 把前面的注释删除        加载imudp模块,启用对UDP网络接口的支持
$UDPServerRun 514            # 把前面的注释删除        用于通信的端口

$ModLoad imtcp                # tcp
$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每天执行一次:
[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主配置文件
[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个历史日志文件
}
  • 子配置文件
[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
}
学前沿IT,到英格科技!本文发布时间: 2024-05-31 22:36:47

results matching ""

    No results matching ""