计划任务
Linux计划任务
未来某一时刻执行一次任务:at,batch
周期性运行某个任务:cron
at命令
[root@localhost ~]# at —help
at: invalid option — ‘-‘
Usage: at [-V] [-q x] [-f file] [-mMlbv] timespec …
at [-V] [-q x] [-f file] [-mMlbv] -t time
at -c job …
atq [-V] [-q x]
at [ -rd ] job …
atrm [-V] job …
batch
用法说明
at [option][time]
-t time run the job at time, given in the format [[CC]YY]MMDDhhmm[.ss]
-f file
file ——> command
time:
HH:MM[YY-mm-dd]
moon,midnight,teatime
tomorrorw
now+#{m,h,d,w}
[root@localhost ~]# at -t 202001010000
at> echo $(data)
at>
job 5 at Wed Jan 1 00:00:00 2020
[root@localhost ~]# atq # 查看默认队列中的at相关的计划任务
job 7 —> jobid
-c cats the jobs listed on the command line to standard<br /> output.
atrm [jobid]:删除指定at命令
batch命令:让系统自动选择空闲时间渠执行此处指定的任务
/var/spool/mail/root —>任务计划执行输出的文件
Linux系统是由crond这个系统服务来控制周期性任务,并且这个服务默认启动的,因为满足使用者控制计划用户,提供了crontab命令
系统任务调度
系统周期性所要执行的工作,如写缓存数据到磁盘中,日志清理,在/etc/crontab文件是系统任务调度的配置文件
首先要确保crond守护进程处于运行状态,通过systemctl status crond查看
[root@localhost ~]# systemctl status crond | grep Active | awk -F” “ ‘{print $2}’
active
[root@localhost ~]# cat /etc/crontab #配置文件
SHELL=/bin/bash 执行shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #系统执行命令的路径
MAILTO=root #执行任务将通过电子邮箱发送给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
minute hour month week user-name
每天晚上9点10分运行echo命令
10 9 * 张三 echo“hello”
时间表示法
1.特定值
给定时间点的有效范围值
2.
给定时间点上有效范围内的所有值,表示“每”
3.离散取值
#,#,#
10,30,40 9 表示每天九点10分30分40分
4.连续取值
#-#
10-30 9
5.在指定时间范围上,定义步长/
/# :# 表示步长
0 /3 * 表示每3个小时
用户任务调度
[root@localhost ~]# crontab —help
crontab: invalid option — ‘-‘
crontab: usage error: unrecognized option
Usage:
crontab [options] file
crontab [options]
crontab -n [hostname]
Options:
-u
-e edit user’s crontab #编辑用户任务调度(创建)
-l list user’s crontab # 列出任务列表
-r delete user’s crontab # 删除
-i prompt before deleting #配合-r参数进行使用,会有删除提示
-n
-c get host in cluster to run users’ crontabs #获取主机(集群当中)
-s selinux context
-x
为用户张三创建计划任务
[root@localhost ~]# crontab -e -u zhangsan
no crontab for zhangsan - using an empty one
crontab: installing new crontab
查看用户的任务列表
[root@localhost ~]# crontab -l -u zhangsan
0 /3 zhangsan echo”hello”
删除指定任务:打开编辑删除指定任务
[root@localhost ~]# crontab -e -u zhangsan
删除用户的所有任务
[root@localhost ~]# crontab -r -i -u zhangsan
crontab: really delete zhangsan’s crontab? y
ps:如果不使用-u参数,默认用户是当前用户root
小细节:
/user/bin/echo —-> command尽量去添加上命令的执行路径
/var/log/cron —->计划任务的日志文件
用户计划任务编辑的时候,如果出现任务计划不执行,建议将以下代码写到用户计划文件中:
SHELL=/bin/bash 执行shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin 系统执行命令的路径
练习
1.保留app01应用一周内的日志/var/log/app01/
0 0 * root find /var/log/app01/ -m ctime +7 -exec rm -rf {}\;
Linux进程管理
在计算机中,系统调用(system call)(系统呼叫)
指运行在用户空间的程序向操作系统内核请求需要获取更高权限运行的服务
用户空间想要操作内核空间的资源时,需要使用系统调用
系统调用时提供给用户程序与操作系统之间的接口,大多数系统交互式操作需求在内核空间执行,如IO操作,进程通讯等
内核功能
进程管理
文件系统
网络功能
内存管理
驱动程序
安全功能
程序:通常都是binary file,放置在存储介质中(硬盘,光盘等)
进程:程序被触发之后,执行者的权限和属性、程序的代码所有的资料都被载入到内存之中,操作系统会给这些内存单位分配一个识别码(PID),可以说,一个正在运行的程序就是一个进程
includ <系统调用的库>
open()函数打开一个文件的时候 —-> 系统调用,访问内核空间里的资源
程序通过库文件去调用系统调用层上的开放接口(方法),进而调用硬件设备中的资源,再将结果返回到程序中
分配内存空间,CPU对程序进行运算,意味着生成进程
进程创建—fork()函数创建
init:PID为0的父进程
进程都是由父进程进行创建的
进程
线程
协程
协程是一种轻量的线程,一个进程中如果只创建了一个线程,可以称之为协程
线程由进程创建,一个进程可以创建多个线程
面试高频
进程之间的通信:
管道:只在父子进程之间通信
命名管道:可以在任何进程之间通信
消息队列
共享存储:最快的IPC通信
信号量:常作为一种锁机制
套接字socket
信号
线程之间的通信:
同一个进程下的线程可以直接通信
共享变量:通过改变变量进行协同通信
队列:生产者消费者模型,本质上是线程共享内存
进程PID
进程优先级
0-99:实时优先级,数字越小优先级越低
100-139:静态优先级,数字越小优先级越高
nice值:-20,19 nice0->120
进程类型
前台进程:跟终端有关。通过终端启动的进程,终端如果关闭,进程也会关闭
守护进程:在系统引导过程中启动的进程,跟终端无关的进程 daemon process
note:也可以把前台启动的进程送往后台,以守护模式运行
进程的状态
运行态:running 正在运行的进程
就绪态:ready 比如:等待IO操作的进程,IO操作需要进行系统调用,
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:暂停于内存中,但不会被调度,除非手动启动,stopped
僵死态:zombie —->僵尸进程—->如何清理僵尸进程
僵尸进程产生的过程
父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE
,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait()
系统调用来获取子进程的退出状态以及其它的信息。在
wait 调用之后,僵尸进程就完全从内存中移除。因此一个僵尸存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失,但如果编程不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中
**
进程的分类
CPU-Bound(CPU密集型):高计算,cpu资源比较高的
IO-Bound(IO密集型):IO高的进程,磁盘的IO等
进程管理
ps命令
ps - report a snapshot of the current processes.
打印当前所有进程的快照的报告
Linux系统各进程相关信息均保存在/proc/PID目录下的各文件中
ps常用组合方式:aux
ps -aux | ps aux
To see every process on the system using BSD syntax
a: 与终端相关的进程
u: 以用户为中心组织进程状态信息显示
x: 与终端无关的进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户 进程ID CPU的占用率 MEM的占用率
VSZ:virtual memory size 虚拟内存集
RSS:resident size 常驻内存集—其他的都可以放入到交换内存中
stat:进程状态
R:running
S:interruptable sleeping 可中断睡眠进程
D:uninterruptable sleeping 不可中断睡眠进程
T:stopping 暂停进程
Z:zombie 僵尸进程
+:前台进程
s:seesion leader
1:多线程进程
<:高优先级进程
n:低优先级进程
START: 启动时间
time:运行占据CPU的时长
COMMAND:有哪个命令来启动相关进程
tty:当前终端
PPID:父进程
ps -ef | ps -elf
To see every process on the system using standard syntax
-e:显示所有进程
-l:Long format. The -y option is often useful with this.
-f:显示完整格式程序信息
ps -eFH
自定义格式去查看所有进程(相关字段)
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan
ni: nice值
pri: 优先级
psr 进程绑定的cpu
rtprio: 实时优先级
自定格式的时候,需要制定相关字段:
man ps
【STANDARD FORMAT SPECIFIERS】
…….
ps tree:进程树
[root@localhost ~]# yum whatprovides pstree
[root@localhost ~]# yum install-y psmisc-22.20-16.el7.x86_64
[root@localhost ~]# pstree —help
pstree: unrecognized option ‘—help’
Usage: pstree [ -a ] [ -c ] [ -h | -H PID ] [ -l ] [ -n ] [ -p ] [ -g ] [ -u ]
[ -A | -G | -U ] [ PID | USER ]
pstree -V
其他命令
pidof命令:find the process ID of a running program.
top命令:top - display Linux processes
top - 01:12:09 up 4:12, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.
KiB Mem : 997956 total, 513604 free, 133472 used, 350880 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 678116 avail Mem
top命令 当前用户 系统开机时长 系统启动时间 系统登录用户
load average:0.02,0.02,0.05 系统的平均负载 10分钟 5分钟 1分钟
通常来说:平均负载会小于CPU总数
* 平均负载并不等于cpu使用率
平均负载=cpu使用率+ready状态的进程的系统占用率
平均负载很高的情况下排查和判断:
-首先查看running状态的进程对cpu使用率是否正常
-然后查看系统中是否存在大量的ready状态的进程在占用资源
-根据上述排查,判断平均负载很高的原因
%cpu:用户 系统 nice值 id wait
MEM:内存使用情况
SWAP:交换内存使用情况
内置命令:
排序
P:以占据的CPU百分比进行排序
M:已占据的MEM百分比进行排序
T:以积累占据CPU时长进行排序
首部信息提示:
uptime信息:l命令
task及cpu信息:t命令
cpu分别显示:1命令 可以去查看每个cpu的使用情况
memory信息:m命令
退出命令:q命令
修改刷新时间间隔:s命令
终止指定进程:k命令 —> kill命令是一样的
选项:
-d #:指定刷新时间间隔,默认3s
-b:以批次方式显示
-n #:显示多少批次
buff:缓冲区,数据存储到内存的地址空间,写数据
cache:缓存区,数据从内存中读取后的地址空间,读数据
htop命令
通过epel仓库安装
epel仓库: 包含很多第三方工具包
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装:yum install -y htop
内置命令:
s: 跟踪选进程的系统调用 —— 使用strace命令
l: 显示选定进程打开的文件列表 —- 使用lsof命令
[: 将选定的进程绑定至某指定的cpu核心上
常用参数:
-d #: 指定延迟时间
-u Username: 仅显示指定用户的进程
-s Colomn: 以指定字段进行排序
vmstat命令:
Report virtual memory statistics
使用方法:
vmstat [options] [delay [count]]
参数选项 延时 次数
进程:
r:等待运行的进程个数
b: 处于非中断睡眠状态的进程个数(被堵塞的队列长度)
memory:
swapd: 交换内存的使用总量
free: 空闲物理内存的总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:数据进入swap中的数据速率(kb/s)
so:数据传出swap的数据速率
io:
bi:从块设备读入数据到系统的速率
bo:保存数据至块设备的速率
system:
in:中断速率
cs:进程切换速率
cpu:
us:用户空间占据比例
sy:内核空间占用比例
id:idle占用时长
wa:等待io的时长
st:虚拟状态集时长
常用参数:-s参数 显示内存的统计数据
kill命令:terminate a process
向进程发送控制信号,以实现对进程的管理
使用方法:
kill [-s signal|-p] [-q sigval] [-a] [—] pid…
-s:指定信号量
-1:显示当前系统可用信号
常用信号:
1) SIGHUP:无须关闭进程而让其重新读取配置文件
2) SIGINT:终止正在运行的进程 相当于CTRL+C
9) SIGKILL:杀死正在运行的进程
15) SIGTERM:中断正在运行的进程
指定信号的方式:
1.信号的数字标识 kill -s 15
2.信号的完整名称 kill -s SIGHUP
3.信号的简写名称 kill -s UP
终止“名称”下的所有进程
killall [-signal] Program ….
进程优先级调整
静态优先级:100-139,可以手动修改
nice值: -20 - 19
进程默认启动时nice为0,相当于优先级120
nice/renice:可以去修改进程的nice值,来达到控制静态优先级
nice命令
Usage: nice [OPTION] [COMMAND [ARG]…]
-n:可以指定执行命令时的nice,默认为10
renice命令:
renice [-n] priority [-gpu] identifier…
示例:renice +1 987 -u daemon root -p 32
+1:nice+1,意味着优先级+1
987:进程ID
-u:进程名
-p:pid
centos7启动流程
1.post开机自检
BIOS(标准输入输出系统程序)程序检查硬件设备(CPU、内存、硬盘等)是否能够正常运行
2.Boot sequence
选择启动设备来加载MBR(磁盘的引导格式),读取MBR中的bootloader(引导程序)
3.加载bootloader
BOTS选择启动设备之后加载MBR中bootloader
bootloader实现的功能是提供一个菜单给用户(选择合适的内核版本)
3.x GRUB阶段
stage1:识别并驱动stage2所在分区的文件系统
stage1.5:加载stage2所在的文件系统
stage2:加载内核文件以及临时根文件系统
4.kernel自身初始化
作用:
1.探测可识别到的所有硬件设备
2.加载硬件驱动程序
3.以只读方式挂载根文件系统
4.运行用户空间的第一个应用程序:/sbin/init
———————->centos7系统启动完成
init管理用户空间服务进程
init可以理解成内核派来管理用户空间的使者。init这个初始化程序会根据其配置文件执行一系列操作,centos5、6、7虽然init配置文件不同,但是他们的启动流程一样
centos7:
初始化程序init是systemd,init依然可以正常使用
systemd的配置文件为:
/usr/lib/system/systemd/
/ etc/systemd/system/
centos 服务级别
# 0 - halt (Do NOT set initdefault to this)
# 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
# 1 - Single user mode
# 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 运行级别2:多用户状态(没有NFS)
# 3 - Full multiuser mode
# 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
# 4 - unused
# 运行级别4:系统未使用,保留
# 5 - X11
# 运行级别5:X11控制台,登陆后进入图形GUI模式
# 6 - reboot (Do NOT set initdefault to this)
# 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
NFS:不支持网络文件系统 Network File systemd
systemd特性
init—>systemd:管理用户空间的服务进程
特性:
系统引导是实现服务并启动
按需激活进程
系统状态的快照
给予依赖关系定义服务控制逻辑
核心概念:unit
通过配置文件进行标识和配置服务进程,文件中主要包含系统服务
监听sock,保存的系统快照以及其他与init相关的信息
保存路径:
/usr/lib/systemd/system/ **
/run/systemd/system/
/etc/systemd/system/
unit文件类型
配置文件的不同文件扩展名代表不同的unit类型
service unit:文件扩展名为.service的配置文件,用于定义系统服务
target unit:文件扩展名为.target的配置文件,用于模拟实现“运行级别”
运行级别:某个服务进程在相应的运行级别才启动
device unit:文件扩展名为.device用于定义内核识别的设备
mount unit:文件扩展名为.mount定义文件系统挂载点
socket unit:文件扩展名为.socket,用于表示进程间通信的socket文件
snapshot unit:文件扩展名为.snapshot,管理系统快照
swap unit:文件扩展名为.swap,用于标识swap设备
automount unit:文件扩展名为.automount,文件系统的自动挂载
path unit:用于定义文件系统中的一个文件或目录
关键特性:
基于socket的激活机制
基于bus的激活机制
基于device的激活机制
基于path的激活机制
系统快照,保存各个unit的当前状态信息于持久化存储中
向后兼容sysv init脚本
不兼容
systemctl 命令固定不变
给有systemd启动的服务,systemctl命令不可以通信管理
centos7 系统服务管理命令:systemctl
常用使用方式:
systemctl enable name,service #设定某个服务自启动
systemctl disable name,service #设定某个服务不启动
systemctl start name,service #启动某个服务
systemctl stop name,service #停止某个服务
systemctl restart name,service #重启某个服务
systemctl status name,service #查看某个服务的状态
systemctl try-restart name,service #条件式重启某个服务
systemctl reload-or-restart name,service #重载或重启服务
systemctl is-active name,service #查看某个是否处于激活状态
systemctl list-units —type service #查看所有已经激活的服务
systemctl list-units —type service —all #查看所有服务
centos6:service管理
启动:servcie Name start | restart | stop | status …
chkconfig命令:
查看某服务是否自启动
设定某个服务自启动
设定某个服务不自启动
查看所有服务的开机自启动状态
entos6 iptables 服务 unit ——> systemd管理 —> 配置文件
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network服务在哪个运行级别下才开机自启动 on代表:自启 off: 不自启
chkconfig [—level
运行级别的切换
1)init N(0-6)
2)systemctl isolate [N | name,target]
0-6运行级别所对应的target配置文件:
runlevel0.target -> poweroff.target
runlevel1.target -> rescue.target
runlevel2.target -> multi-user.target
runlevel3.target -> multi-user.target
runlevel4.target -> multi-user.target
runlevel5.target -> graphical.target
runlevel6.target -> reboot.target
查看运行级别
1)runlevel
2)systemctl list-unit —type target
查看默认运行级别
1) /etc/inittab文件
2)systemctl get-default
修改默认运行级别:
1)/etc/inittab文件
2) systemct set-default TARGET.target
切换救援模式
systemctl rescue
其他常用命令
关机: shutdown poweroff init 0 systemctl halt systemctl poweroff
重启: reboot init 6 systemctl reboot
挂起: systemctl suspend
快照: systemctl hibernate
快照并挂起: systemctl hybrid-sleep
如果想要设置某服务或脚本开机自启
1) [root@node1 system]# cat /etc/rc.d/rc.local —-> 将脚本运行命令放入当前文件中
2) [root@node1 system]# cd /etc/rc.d/init.d/ ——> 该目录下的脚本会在初始化的时候进行执行
如果某个服务想要由systemctl命令管理
/usr/lib/systemd/system/Name.service
chrond服务的配置实例:
[root@node1 system]# cat chronyd.service
[Unit]
Description=NTP client/server
Documentation=man:chronyd(8) man:chrony.conf(5)
After=ntpdate.service sntp.service ntpd.service
Conflicts=ntpd.service systemd-timesyncd.service
ConditionCapability=CAP_SYS_TIME
[Service]
Type=forking
PIDFile=/var/run/chrony/chronyd.pid
EnvironmentFile=-/etc/sysconfig/chronyd
ExecStart=/usr/sbin/chronyd $OPTIONS
ExecStartPost=/usr/libexec/chrony-helper update-daemon
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full
[Install]
WantedBy=multi-user.target