详解Linux例行性工作

例行性工作(计划任务)

场景:

  • 生活中,我们有太多场景需要使用到闹钟,比如早上7点起床,下午4点开会,晚上8点购物,等等。
  • 再Linux系统里,我们同样也有类似的需求。比如我们想在凌晨1点将文件上传到服务器,或者在晚上10点确认系统状态,等等。
  • 但是我们不可能一直守在电脑前,毕竟我们也需要下班/睡觉,还要陪女朋友。而且即使在上班期间,如果到点了还需要人工操作,未免效率太低了。
  • at命令就是为这个需求而诞生的使用at命令,你可以在特定时间自动完成你所设定的任务,也可以实现自动化,非常方便快捷。

单一执行的例行性任务—at(一次性)

安装

使用yum安装at

[root@server ~]# yum install at
  • at命令一般默认安装在系统中,通过下列命令查看版本号
[root@server ~]# at -V
at version 3.1.23
  • 查看at执行的状态
[root@server ~]# systemctl status atd  # 查看状态
[root@server ~]# systemctl enable --now atd # 设置开机自启动

at命令详解

格式

at   日期时间

实例1

[root@server ~]# at 1:09
warning: commands will be executed using /bin/sh
at> ls /root > at.txt
at> <EOT>        # 按下ctrl+d退出at输入状态
job 2 at Tue Nov 14 01:09:00 2023 # job 1为工作编号
[root@server ~]# at  -l   # 浏览计划任务列表
[root@server ~]# atq    # 浏览计划任务列表[root@server ~]# ls     # 查看结果
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg  at.txt
[root@server ~]# cat  at.txt 

参数

[root@server ~]# at -l
atq:等价于at  -l
[root@server ~]# at -c 8    # 列出任务后的命令内容(8为工作编号)
[root@server ~]# at -d 6    # 删除或取消一个任务(6为工作编号)

实例2

  • 不使用交互命令实现at任务
#从当前开始,经过1分钟后执行
[root@server ~]# echo "ls /root > at.txt" | at now +1 minutes
warning: commands will be executed using /bin/sh
job 11 at Tue Nov 14 01:45:00 2023
[root@server ~]# at -l
11      Tue Nov 14 01:45:00 2023 a root
工作编号            执行时的时间[root@server ~]# echo "rm -fr /root/at.txt" | at now +1 minutes
warning: commands will be executed using /bin/sh
job 12 at Tue Nov 14 01:46:00 2023
时间格式
参数说明
HH:MM今天HH小时的MM分钟执行,若时间错过则在明天执行
HH:MM YYYY-MM-DD规定在某年某月某日的特殊时间执行
now +数字 时间单词now +2 minutes
now +3 hours
now +4 days
now +5 weeks
表示从当前开始,经过多长时间后执行

注意

  • at命令只要指定的时间正确,就可以执行对应的命令
  • at命令的输出结果不会显示在屏幕上
  • at命令中执行的命令最好使用绝对路径,不容易报错
  • 过程:输入at 时间—>回车—>输入执行命令—>ctrl+d退出at编辑
  • 按ctrl+Backspace删除at命令行中的错误输入
  • at命令只会执行一次

at命令执行过程分析

  • 第一步:寻找/etc/at.allow(白名单)是否存在,写在该文件中的用户才可执行at命令
  • 第二步:若/etc/at.allow不存在,则寻找/etc/at.deny(黑名单)文件,写在该文件中的用户不能使用at命令
  • 第三步:若两个文件都不存在,则只用root可以使用at命令
  • 注意:若拒绝某用户使用at命令则可以将用户名写入到/etc/at.deny中

实例3

  • 设置某些账户不可使用at命令
[root@server ~]# useradd ce1   # 新建账户
[root@server ~]# passwd ce1   # 设置账户密码
更改用户 ce1 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# id ce1    # 查看账户信息
用户id=1001(ce1) 组id=1001(ce1)=1001(ce1)
[root@server ~]# vim /etc/at.deny  # 编辑黑名单
写入ce1
[root@server ~]# su ce1  # 切换账户
[ce1@server root]$ cd
[ce1@server ~]$ at 2:12
You do not have permission to use at.
[ce1@server ~]$ su root
密码:
[root@server ce1]# cd
[root@server ~]# vim /etc/at.deny
删除ce1
[root@server ~]# su -l ce1  # 切换账户(-l回到用户的家目录)
[ce1@server ~]$ at 2:14
warning: commands will be executed using /bin/sh
at> <EOT>
job 13 at Tue Nov 14 02:14:00 2023
[ce1@server ~]$ su -l root
密码:
[root@server ~]#

循环执行的例行性任务—crontab(周期性)

crond服务

  • at命令是在指定的时间只执行一次任务crontab命令可以循环重复的执行定时任务,与Windows中的计划任务有些类似
  • crond是Linux下用来周期地执行某种任务或等待处理某些事件的一个守护进程,在安装完成操作系统后,默认会安装crond服务工具,且crond服务默认就是自启动的,若需要安装则执行若下命令:
[root@server ~]# yum install crontabs
安装包名和服务包名不一样
[root@server ~]# systemctl status crond
  • crond进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务,crontab命令需要crond服务支持
  • Linux任务调度的工作主要分为以下两类:
    • 系统执行的工作:系统周期性所要执行的工作,如备份系统数据,清理缓存等等
    • 个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有信息,这些工作可由每个用户自行设置

crontab工作过程

  • 当系统中有 /etc/cron.allow文件时,只有写入此文件的用户可以使用crontab命令没有写入的用户不能使用crontab命令。同样,如果有此文件,/etc/cron.deny文件会被忽略,因为/etc/cron.allow文件的优先级更高
  • 当系统中只有/etc/cron.deny文件时,写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用crontab命令
  • crontab执行的每一项工作都会被记录到/var/log/cron这个日志文件中
  • 当用户使用crontab新建工作之后,该项工作就会被记录到/var/spool/cron目录里面

crontab命令详解

格式

crontab    [-u user]   [-l | -r | -e]

参数

参数说明
-u指定用户执行该任务
-e编辑crontab工作内容
-l查询crontab任务内容
-r删除crontab任务

编辑crontab

格式

crontab  -e

注意:

  • 写入的命令一行一个命令,每行共6段:前5段为时间,最后一段为命令
  • 时间共5段,意义如下:
表示意义星期
数字范围0-590-231-311-120-7(0和7都表示星期天)
特殊字符
*     表示任意时刻
-     表示范围
,      分割时段
*/数字      指定时间间隔频率,如:每3分钟执行一次:*/3
时间描述示例
1 2 * * *      每天凌晨2点1分执行动作
0 17 * * 1    每周1下午5点整执行动作
0 5 1,15 * *    每月的1日和15日凌晨5点整执行动作
40 4 * * 1-5     每周1到周5凌晨4点40分执行动作
*/10 4 * * *       每天凌晨4点每隔10分钟执行动作
3,15 8-11 */2 * *    每隔2天上午8-11点的第3分钟和第15分钟执行动作
* * * * *      每隔1分钟执行动作

实验1

  • 编写脚本test.sh(脚本必须以.sh为文件扩展名
[root@server ~]# vim test.sh
#!/bin/bash              (指定脚本解释器)while :
doecho  "this is my test sh"$(date)  >>  /root/cro.txtsleep 1
done
  • 设置周期性的计划任务
[root@server ~]# crontab -u redhat -e

默认当前用户

[root@server ~]# crontab  -e
*/1 * * * * /bin/bash  /root/test.sh

注意:crond服务会自动启动,crontab命令只要保存就会生效

  • 查看任务 -l
[root@server ~]# crontab  -l
*/1 * * * * /bin/bash  /root/test.sh
  • 删除任务 -r
[root@server ~]# crontab  -r    # 删除
[root@server ~]# crontab  -l    # 查看
no crontab for root
  • 此实验需要终止循环进程
[root@server ~]# ps -aux | grep test   # 查看已存在的test进程
root        3895  0.0  0.1 221680  2372 pts/0    S+   10:59   0:00 grep --color=auto test
[root@server ~]# kill  -9  进程号
[root@server ~]# kill  -9  3895   # 强制终止

实验2

  • 让系统每周1凌晨6点重启一次
[root@server ~]# crontab -e
0 6 * * 1    /sbin/shutdown -r now
[root@server ~]# crontab -l
0 6 * * 1 /sbin/shutdown -r now
  • 不想执行该任务可以删除
[root@server ~]# crontab -r
[root@server ~]# crontab -l
no crontab for root

实验3(重点)

实验内容:设置邮件发送功能:每1分钟发送1封邮件

  • 首先我们要做的就是QQ邮箱设置

1.使用浏览器打开qq邮箱,点击设置
在这里插入图片描述
2.点击账号
在这里插入图片描述
3.选择POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,然后开启服务,获得授权码
在这里插入图片描述
在这里插入图片描述

  • 安装邮件服务

注:不同发行版本的邮件服务名不一样,RHEL9的邮件服务名为s-nail

[root@server ~]# yum install s-nail -y
  • 配置邮件服务
[root@server ~]# vim /etc/s-nail.rc
set from=123456789@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=123456789@qq.com
set smtp-auth-password=abcdefghijklmnop      # 这里是16位的授权码
set smtp-auth=login

注意:文件配置完毕需要强制保存并退出,末行模式下输入wq!

  • 测试一下邮件服务
[root@server ~]# echo '内容' | mail -s '主题' 123456789@qq.com

敲完这个命令后,在你的qq邮箱就会立刻收到邮件
在这里插入图片描述

  • 测试完成,我们再来设置周期性的任务,每个1分钟发送邮件
[root@server ~]# crontab -e
MAILTO=17674044@qq.com* * * * * echo  "警告,server服务器内存较低,请速处理."  |  mail  -s  "告警邮件"  123456789@qq.com

在这里插入图片描述

  • 实验完成之后,删除循环执行任务,不然你的qq邮箱得爆,哈哈哈
[root@server ~]# crontab -r
[root@server ~]# crontab -l
no crontab for root
书写定时任务得注意事项
  • 6个字段都不能为空,如果不确定则使用*表示任意时间
  • crontab命令任务的最小时间单位为分钟,最大有效时间为月,如:2024年某时执行、3点30分30秒这样的时间日期无法被识别
  • 定义时间时,日期和星期最好不要一起出现,由于都是以天为单位,非常让管理员混淆
  • 在定时任务中不能,不管是写命令还是在脚本中写命令,最好都用绝对路径,相对路径有时会报错

系统级别的计划任务(crontab的另一种计划任务)

crontab -e是每个用户都可以执行的命令,但是有时定时任务必须由系统执行,此时就需要编辑 /etc/crontab配置文件来实现

[root@server ~]# vim /etc/crontab
  • 仅能通过root定义,不可以使用普通账户身份去执行计划任务
  • 方法:在/etc/crontab最后一行新增计划任务即可
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root# For details see man 4 crontabs# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
  • 分析:
    • SHELL=/bin/bash :指定系统使用哪个shell解释器去执行
    • PATH=/sbin:/bin:/usr/sbin:/usr/bin : 系统执行命令的搜索路径
    • MAILTO=root :表示执行任务的信息通过邮件发送给谁
    • MAILTO=root :表示执行命令的用户是谁
实验4

每天6:00将日志文件/var/log/messages文件进行备份,备份到/backup目录中,备份时需要将logfileYYYY-MM-DD-HH:MM:SS

[root@server ~]# mkdir  /backup[root@server ~]# vim  /etc/crontab
0 6 * * * root  /usr/bin/cp  /var/log/messages /backup/logfile`date  +\%Y-\%m-\%d-\%H:\%M:\%S` # 注意# 反引号``:表示将引起的内容识别为命令# 在crontab中%表示换行,需要增加转义符\进行转义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS Code搭建windows+远程Linux上Docker的开发环境

在本地windows桌面系统远程Linux上Docker搭建开发环境主要步骤如下&#xff1a; 一、安装vs code和插件 在windows系统上安装vs code&#xff0c;并安装好remote-ssh、dev-container插件&#xff0c;也可以直接安装Remote Development&#xff0c;他会默认把vs code远程的几种…

【硬件基础】STM32F103C8T6芯片引脚定义及功能介绍

1、引脚图片 2、引脚定义图 3、引脚功能介绍 3.1引脚定义图解释 上表中&#xff0c;S表示电源&#xff0c;IO表示输入输出&#xff0c;FT表示容忍电压可达5V&#xff0c;没有FT的只能达3.3V。 VBAT&#xff0c;备用电源引脚&#xff0c;当系统断电时&#xff0c;备用电源可给…

GEE错误——Landsat9数据集进行去云操作后显示白板

问题 我遇到了一些有关 Landsat9 图像中的云遮蔽和图像处理的问题。我正在分享我所使用的代码以及我感兴趣的区域(资产)。请帮我解决这个问题。我是一名 GEE 学习者。问题:最终图像在大面积上有云状覆盖。 这里我们查看了搜索出的代码发现并不是没有数据集导致的,该区域有…

springcloud第3季 consul服务发现注册,配置中心2

一 consul的作用 1.1 为何使用注册中心 为何要用注册中心&#xff1f; 1.A服务调用B服务&#xff0c;使用ip和端口&#xff0c;如果B服务的ip或者端口发生变化&#xff0c;服务A需要进行改动&#xff1b; 2.如果在分布式集群中&#xff0c;部署多个服务B&#xff0c;多个服…

运动想象 (MI) 迁移学习系列 (3) : MSFT

运动想象迁移学习系列:MSFT 0. 引言1. 主要贡献2. 数据增强方法3. 基于度量的空间滤波转换器3.1 空间过滤3.2 脑电图ViT3.2.1 变压器编码器层3.2.2 基于度量的损失函数 4. 实验结果4.1 消融实验4.2 基线任务对比4.3 跨主题 5. 总结欢迎来稿 论文地址&#xff1a;https://www.s…

用C语言执行SQLite3的gcc编译细节

错误信息&#xff1a; /tmp/cc3joSwp.o: In function main: execSqlite.c:(.text0x100): undefined reference to sqlite3_open execSqlite.c:(.text0x16c): undefined reference to sqlite3_exec execSqlite.c:(.text0x174): undefined reference to sqlite3_close execSqlit…

对中国境内所有地区KFC门店基本信息的统计(简略版)

我们要获取每个地区的kfc信息就要先获取中国一共有哪些地区 中国所有城市名称获取 import requests from lxml import etreewith open(f./省份.txt, w) as fp:fp.write() with open(f./城市.txt, w) as fp:fp.write()url1http://www.kfc.com.cn/kfccda/storelist/index.aspx#…

如何基于 esp-at 固件测试 TCP (UART 转 WiFi 透传)吞吐?

测试工具&#xff1a; windows/Ubuntu/Android&#xff08;电脑或手机与 ESP 开发板连接相同路由器&#xff09;iperf2 工具ESP 系列的开发板USB-TTL 串口调试工具路由器 测试固件&#xff1a; AT 固件 AT 固件硬件接线说明 不同环境下的 Iperf 工具安装说明 Iperf 工具用于…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:Nginx1.25.3

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

【数学】【组合数学】1830. 使字符串有序的最少操作次数

作者推荐 视频算法专题 本博文涉及知识点 数学 组合数学 LeetCode1830. 使字符串有序的最少操作次数 给你一个字符串 s &#xff08;下标从 0 开始&#xff09;。你需要对 s 执行以下操作直到它变为一个有序字符串&#xff1a; 找到 最大下标 i &#xff0c;使得 1 < i…

Android14之解决报错:No module named selinux(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

数据库 — 增删查改

一、操作数据库、表 显示 show databases;创建 create database xxx;使用 use xxx; 删除 drop database xxx;查看表&#xff1b; show tables; 查看表结构 desc 表名; 创建 create table 表名(字段1 类型1&#xff0c;字段2 类型2&#xff0c;.... ); 删除 drop table 表名; 二…

uniapp小程序获取位置权限(不允许拒绝)

需求 小程序上如果需要一些定位功能&#xff0c;那么我们需要提前获取定位权限。我们页面的所有功能后续都需要在用户同意的前提下进行&#xff0c;所以一旦用户点了拒绝&#xff0c;我们应该给予提示&#xff0c;并让用于修改为允许。 实现 1.打开手机GPS 经过测试发现即使…

【Java网络编程】TCP核心特性(下)

1. 拥塞控制 拥塞控制&#xff1a;是基于滑动窗口机制下的一大特性&#xff0c;与流量控制类似都是用来限制发送方的传送速率的 区别就在于&#xff1a;"流量控制"是从接收方的角度出发&#xff0c;根据接收方剩余接收缓冲区大小来动态调整发送窗口的&#xff1b;而…

深入分析Java线程池——ThreadPoolExecutor

文章目录 Java 线程池概述ThreadPoolExecutor 构造方法线程池拒绝策略工作流程并发库中的线程池CachedThreadPoolFixedThreadPoolSingleThreadExecutorScheduledThreadPool ThreadPoolExecutor 源码分析线程池状态表示获取 runState获取 workerCount生成 ctl 提交任务 execute(…

漫谈技术成长

引言 相信很多程序员在自己的技术成长之路上&#xff0c;总会遇到许许多多的难关&#xff0c;有些难关咬咬牙就过去了&#xff0c;而有点难关则需要有一定的能力&#xff0c;才能克服。因此&#xff0c;本文主要围绕“技术成长” 话题&#xff0c;为何会选择技术方向&#xff0…

开源的Java图片处理库介绍

在 Java 生态系统中&#xff0c;有几个流行的开源库可以用于图片处理。这些库提供了丰富的功能&#xff0c;如图像缩放、裁剪、颜色调整、格式转换等。以下是几个常用的 Java 图片处理库的介绍&#xff0c;包括它们的核心类、主要作用和应用场景&#xff0c;以及一些简单的例子…

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer&#xff08;归一化&#xff09;&#xff08;更加推荐使用&#xff09; 优点&#xff1a;将每个样本向量的欧几里德长度缩放为1&#xff0c;适用于计算样本之间的相似性。 缺点&#xff1a;只对每个样本的特征进行缩放&#xff0c;不保留原始数据的分布形状。 公式…

C语言指针从入门到基础详解(非常详细)

1.内存和地址 我们知道电脑中的CPU在处理数据的时候需要在内存中读取数据处理后的数据也会放在内存中。把内存划分为一个个的内存单元每个单元的大小是一个字节。每个字节都有它对应的编号也就是它的地址&#xff0c;以便CPU可以快速的找到一个内存空间。C语言中我们把地址叫做…

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁,锁升级

MySQL-锁&#xff1a;共享锁&#xff08;读&#xff09;、排他锁&#xff08;写&#xff09;、表锁、行锁、意向锁、间隙锁 共享锁&#xff08;读锁&#xff09;、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制&#xff0c;它们确保数据的一致性…