目录
1.计划任务
1.1单一计划任务
使用at命令,前提是atd服务启动,任务存在于/var/spool/at目录下,如果有/etc/at.allow文件,则只有文件中的用户才能使用at,如果只有/etc/at.deny文件,那么文件中的用户不能使用at,其余的用户可以,如果两个文件都没有则只有root才能使用at命令。
- at [-mld] 时间:
- -m:任务执行完毕,发送邮件给用户
- -l:列出所有用户的at计划,相当于atq
- -d:取消一个在at计划中的任务,后面接任务号码,相当于atrm
- -c:接任务号码,查看该命令的内容
- -f:执行具体的shell脚本
时间格式:
HH:MM:在今天的某个时间执行,如果超过该时间则明天执行
HH:MM YYYY:MM:DD:在某一个的时刻执行
HH:MM + number [minutes|hours|days|weeks]:在某个时间点在加几个时间后执行,如now +5minutes,5分钟后执行,类似的还有hours、days、weeks、month……
建议使用绝对路径。
任务的执行与终端环境无关,所以标准输入输出不会打印到当前屏幕,只会发送到用户的邮箱,可以使用echo "hello" >/etc/tty1类似的方法得到输出结果
batch:cpu空闲时才会执行该任务,默认负载少于0.8,不能指定特定的时间
1.2周期性计划任务
- crontab:同at,有/etc/cron.allow和/etc/cron.deny其中之一的限制文件,依靠crond这个服务,该任务会被记录到/var/spool/cron目录中
- -u username:只有root可以使用,帮其他用户建立一个计划任务
- -e:编辑crontab的任务内容
- -l:查看任务内容
- -r:删除所有crontab任务,若要删除一项,使用-e去编辑
每个用户都有自己的/var/spool/cron/用户名文件,用于存储定时任务(除非该用户在deny文件中),我们只需要使用crontab -e编辑内容即可,该文件的格式如:
0 12 * * * mail -s "title" < /home/lxc/.bashrc
#分 时 日 月 周 ===========命令串=========
特殊字符:
* | 表示任何时候都接受 |
, (逗号) | 代表分隔时段,如3:00和6:00都执行使用 0 3,6 * * * command |
- | 代表一段时间范围内,如8点到12点的20分都执行使用20 8-12 * * * command |
/数字 | 每隔一段时间执行,如没5分钟执行一次使用 */5 * * * * command |
系统级别的任务,如关机什么的,都需要配置主配置文件/etc/crontab,格式和上面的相同,仅能通过root定义。
- anacron:定期去执行任务,即如果系统关机了导致一些定期任务未执行,crontab不会执行了,而anacron会在开机时自动检测并执行补上。
- -f:强制执行相关工作,忽略时间戳。
- -u:更新 /var/spool/anacron/cron.{daily,weekly,monthly} 文件中的时间戳为当前日期,但不执行任何工作。
- -s:依据 /etc/anacrontab 文件中设定的延迟时间顺序执行工作,在前一个工作未完成前,不会开始下一个工作。
- -n:立即执行 /etc/anacrontab 中所有的工作,忽略所有的延迟时间。
- -q:禁止将信息输出到标准错误,常和 -d 选项合用
2.系统进程管理

2.1任务管理
当我们登录系统获取到bash shell之后执行的名令就是任务,每个任务其实就是目前bash进程的子进程。
- &:将任务放在后台执行,而不是默认的前台执行,如find / -name man >/dev/record &
- 在后台的任务不怕ctrl+c中断执行
- ctrl+z:将当前任务丢到后台中暂停。
- jobs:查看后台任务状态
- -l:同时列出该任务的PID号
- -r:只列出正在后台运行的任务 run
- -s:只列出正在后台暂停的任务 stop
[root@com ~]# jobs
[1] 已停止 mail
[2]- 已停止 vim initial-setup-ks.cfg
[3]+ 已停止 find / -name aaa > /etc/null
第一栏表示任务的任务号,其中括号外面的+表示最近第一个被丢到后台的任务(也是默认任务),-表示最近第二个被丢到后台的任务;第二栏表示任务的状态,第三栏表示该任务所执行的命令
- fg [%任务号]:将任务拿到前台处理,如果不加%任务号,默认将+号的任务放到前台处理,fg -是倒数第二个任务
- bg:让后台暂停的任务在后台运行,stopping状态->running状态,和&运行的任务一样
- kill -signal %任务号:管理后台当中的任务,给予该任务一个信号量。
- kill -l:查看目前kill能使用的信号(signal)有哪些
- signal :可以写信号的数字和英文,使用man 7 signal查看各种信号的作用
- 1:重新读取一次参数的配置文件,类似reload
- 2:和ctrl+c同样的功能,中断程序的运行
- 9:立刻强制删除一个任务,比较暴力
- 15:以正常的进程方式终止一项任务,并删除该任务
- 19:相当于ctrl+z暂停一个进程的运行
kill后面默认接pid号码,如果是任务号不要忘记加%了
2.2脱机管理问题
前面所说的后台是bash的后台,而不是系统后台,如果我们以远程方式连接到系统上,且使用&提交了一个任务到后台,当我们脱机后该任务就不会在执行了。如果想让该任务任然执行可以使用at命令提交任务或者是nohup命令。
- nohup [命令与参数] [&]:把任务提交到系统任务中,当前用户注销后任然继续执行。
执行的结果会重定向到~/nohup.out文件里。
2.3进程管理
- ps:将当前时间点的进程运行情况摘取下来,静态的
- -A:显示所有的进程
- -a:不显示与终端有关的所有进程
- -u:显示有效使用者有关的所有进程
- x:列出比较完整的信息,通常和a一起使用
- l:较长、较详细的将该pid的信息列出
- j:任务的格式
- -f:做一个较为完整的输出
一般用【ps -l】只查看自己bash的进程、【ps aux】查看所有系统运行的进程。
ps -l显示本bash的进程的详细信息如下:
[root@com ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 12678 12669 0 80 0 - 29299 do_wai pts/0 00:00:00 bash
4 T 0 27172 12678 0 80 0 - 37991 do_sig pts/0 00:00:00 mail
4 T 0 27331 12678 0 80 0 - 37446 do_sig pts/0 00:00:00 vim
0 R 0 30960 12678 0 80 0 - 38331 - pts/0 00:00:00 ps
- F:进程标志FLAG,说明进程的权限,4表示权限为root,1表示子进程没有执行
- S:进程的状态STAT,主要状态有:
- R(Running):该进程正在运行,可调度的状态
- S(Sleep):该进程正在睡眠(sleep)状态,可以被唤醒(signal)
- D:不可被唤醒的睡眠状态,通常这个进程是在等待IO的情况,kill -9杀不死
- T(Stop):停止状态,可能在后台暂停
- Z(Zombie):僵尸状态,该进程已经终止但却无法在内存中完全删除,空壳子
- UID:该进程的调用者用户id
- PID:进程的id号
- PPID:进程的父进程PID号码,如上bash进程是其他进程的父进程
- C:代表cpu使用率,单位百分比
- PRI:进程的优先级,数值越小该进程越快被cpu执行
- NI:nice值,也是优先级值,只不过PRI由系统决定不能更改,而NI可以由用户更改,最终的进程优先级=PRI+NI,
- ADDR/SZ/WCHAN:ADDR表示kernel function,指出该进程在内存的哪个部分;SZ表示进程用掉多少内存;WCHAN表示目前进程是否运行,-表示是
- TTY:登陆者的终端位置,若为远程登录则为pts/n,若为?表示和终端无关,一般为内核的态进程
- TIME:进程实际使用的cpu时间
- CMD:触发此进程的命令,如果进程为僵尸状态,命令后面多了个<defunct>
ps aux显示的不详细信息如下:
[root@com ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 193936 7128 ? Ss 2月04 0:13 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 2月04 0:00 [kthreadd]
lxc 30765 0.0 0.3 117028 3364 pts/1 S+ 18:01 0:00 bash -l
rtkit 760 0.0 0.1 198784 1760 ? SNsl 2月04 0:03 /usr/libexec/rtkit-daemon
root 726 0.0 0.0 84556 816 ? S<sl 2月04 0:00 /sbin/audispd
……
其中未讲到的字段有:VSZ:该进程使用的虚拟内存量(KB);RSS:该进程占用的固定内存量;STAT:进程目前的状态;START:进程启动的时间。
其中STAT在基本的RSTDZ状态后面可以加上额外的字符,其中的含义如下:
- <:表示进程运行在高优先级上,高优先级获得的时间片更长
- N:表示进程运行在低优先级上
- L:表示进程有页面锁定在内存中
- s:表示进程是控制进程
- l:表示进程是多线程
- +:表示当前进程运行在前台
- top:动态查看进程的变化
- -d:进程界面更新的秒数,默认5秒一更新
- -p:指定某个pid进行查看、检测对应的进程
top过程中可以指定的按键或操作:
- ?:显示在top当中可以输入的按键命令
- 排序:
- P:以CPU的使用率排序显示,默认值
- M:以Mermory的使用排序显示
- N:以PID来排序
- T:由CPU的使用时间排序
- k:给某个pid一个信号,同kill -signal pid
- r:给某个pid重新定制nice值,root的修改范围为-20~19,普通用户只能修改0~19
- q:退出top按键
- 空格:立即刷新
- u:查看指定用户的进程
top界面如下:
[root@com ~]# top
top - 19:40:25 up 20:08, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 203 total, 2 running, 197 sleeping, 4 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995704 total, 74204 free, 546000 used, 375500 buff/cache
KiB Swap: 1953788 total, 1953788 free, 0 used. 248824 avail Mem
<==如果按k或r会在这提示先输入进程的pid,再需要输入修改的值
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1783 gdm 20 0 3383752 133208 60636 S 0.0 13.4 0:22.98 gnome-shell
885 root 20 0 359108 29796 7224 S 0.0 3.0 0:00.78 firewalld
1622 root 20 0 296084 24340 15692 S 0.0 2.4 0:00.86 X
……
- 第一行有:当前时间、开机到现在经过的时间、当前登录用户人数、1,5,15分钟内的平均任务负载
- 第二行有:进程总量、和一些进程的运行状态
- 第三行有:CPU整体负载 ,如wa表示IO-wait ,等待io的时间,其他的可以man top,搜索关键字。输入1可以查看其他核的负载率。
- 第四、五行:物理内存和虚拟内存的使用量
- pstree:以树状结构显示,父进程和子进程结构分明
- -p:同时列出pid
- -u:同时列出uid
所有进程的父进程都是systemd进程,该进程pid是1.
- 同样的进程也是使用信号(signal)互相管理,使用kill传递信号:kill -signal PID。注意没有%
- killall -signal 命令名称:根据【执行命令的名称】(command)来给予信号量,省去了查找pid
- -i:出现提示字符给使用者,删除前询问
- -I(大写i):忽略大小写
- nice [-n 数字] command:执行命令前,可以先指定对应的nice值,值越小优先级越高
- renice [数字] PID:设置已经启动的进程的nice值
进程的信息可以在/proc/进程号 下找到进程对应的目录和文件
2.4查看系统资源
- free:查看内存使用情况
- -b、-k、-m、g:指定显示单位,默认显示的是k(KB)
- -h:让系统指定合适的单位
- -s:动态刷新,类似top,需要指定刷新间隔秒数
- -c:与-s合用,表示动态刷新几次后自动退出
- uptime:查看系统启动时间与任务负载,和top的第一行差不多
- netstat:追踪网络或socket文件
- -a:所有信息都打印出来
- -p:列出网络服务的进程pid
- -u、-t:显示udp或tcp封包信息
- -n:不以进程的服务名称,以端口号来显示
- dmesg:分析内核产生的信息,即开机时内核检测硬件的一些信息,显示在屏幕上一闪而过
- vmstat:检测系统资源变化。
- vmstat [seconds] [次数]:动态刷新,每几秒刷新,一共刷新多少次,次数省略则是无限
- -f:开机到现在,系统复制(fork)的进程数,即建立的进程数
- -s:将一些事件导致的内存变化情况列表说明
- -S:后面接显示单位,K/M替换默认的Bytes
- -d:列出磁盘的读写总量统计表
- -p:后面列出分区,可显示该分区的读写总量统计表
vmstat基本说明如下:
[root@com ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 74272 116 376120 0 0 3 1 25 44 0 0 100 0 0
进程字段(procs)分别为:
- r:表示等待运行中的进程数量
- b:不可被唤醒的进程数量。这两个项目越多代表系统越忙碌
内存字段(memory)为:
- swapd:虚拟内存被使用的容量
- free:未被使用的内存容量
- buff:缓冲存储器的容量
- cache:高速缓存的容量。这部分和free命令的相同
内存交换区(swap):
- si:从磁盘中将进程取出来的容量
- so:将内存中的进程写入到磁盘你的容量。这两个越大,系统系统越差
磁盘读写(io):
- bi:由磁盘读入的区块数量
- bo:写入到磁盘的区块数量
系统(system):
- in:每秒被中断的进程次数
- cs:每秒执行的事件切换次数。这两个值越大,代表系统与外接设备沟通的越频繁
CPU(和top命令显示的一样):
- us:非内核层的CPU使用状态,即用户启动的进程使用CPU的百分比
- sy:内核层CPU使用状态
- id:闲置CPU的状态
- wa:等待io所耗费的CPU状态
- st:被虚拟机所使用的CPU状态
3.系统服务(daemon)
3.1systemd相关知识点
作用:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
systemd定义它所管理的服务都为一个服务单元unit,unit分为多种不同的类型,如系统服务、数据监听与交换的socket文件服务、提供不同运行级别分类的操作系统环境(target)等。
配置文件:
- /usr/lib/systemd/system:每个服务最主要的启动脚本设置;
- /run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行;
- /etc/systemd/system:管理员根据主机系统的需求建立的执行脚本,比上面的优先级高;
unit类型:
通过查看扩展名识别,通过命令systemctl -t help可以查看所有的类型
- .service:用于定义系统服务,包括服务器本身所需的本地服务以及网络服务等
- .target:一群unit的集合,用于模拟实现运行级别
- .socket:用于标志进程间通信用的socket文件
- .device:用于定义内核识别的设备
- .mount:用于定义系统挂载点
- .timer:定时器,循环执行的服务,用于取代crontab命令,更精确
- .path:用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务
unit配置文件:
如/usr/lib/systemd/system/sshd.service文件
分为三部分:
- [Unit]:unit本身的说明,行为以及依赖关系等,常用设置参数如下
- Description:描述信息,查看系统服务时显示给用户看的信息
- After:说明此unit在哪个unit启动之后才启动的意思,并不强制,功能和before相反
- Requires:说明此unit必须在哪个unit启动之后才启动,强制性的,强依赖
- Wants:弱依赖,这个unit之后最好还要启动什么服务比较好
- Conflicts:定义unit之间的冲突,如果有冲突的服务在启动,当前unit就不能启动
- [Service]:不同的unit类型对应不同的便签,如[Socket]……,常用参数如下
- EnvironmentFile:环境配置文件,如sshd.service配置文件在/etc/sysconfig/sshd
- ExecStart:实际执行此服务的命令或脚本程序。绝对路径
- ExecStartPre,ExecStartPost:分别在ExecStart之前和之后运行
- ExecStop:停止stop unit要运行的命令或脚本程序,一般都是kill命令
- Restart:当设定为1时,当该服务意外终止时,可以自己重新启动
- Type:说明这个服务的启动方式
- simple:默认值,这个服务由ExecStart启动,启动后常驻于内存
- forking:fork一个子进程运行该服务,再将父进程删除
- oneshot:与simple的区别是,不会常驻于内存,运行完就关闭
- notify:启动完成后发送一个消息
- dbus:这个daemon必须要在取得一个D-Bus的名称后,才会继续运作
- idle:通常是开机或者关机运行
- [Install]:将此unit安装到哪一个target里面去
- Alias:别名,可使用sstemctl command Alias.service
- WantedBy:依附于哪一个target unit,大部分服务依附于multi-user.target,命令行默认
- Also:安装本服务的时候还需要安装别的相关服务
在unit文件中,以#开头的行后面的内容会被认为是注释,相关布尔值,1、yes、on、true都是开启0、no、off、false都是关闭,时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明
对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
systemctl daemon-reload
可以通过systemctl cat unit直接查看该服务的配置文件。
3.2管理服务
格式为:systemctl [command] [unit]
command主要有:
- start:立即启动unit
- stop:关闭unit
- restart:重启unit
- reload:不关闭unit,重新加载配置文件,EnvironmentFile
- enable:设置unit下次开机自启动
- disable:开机不自动启动
- status:unit的状态
- mask:禁止自动和手动启动
- unmask:取消禁止
- is-active:目前有没有在运行
- is-enable:是否开机自启
[root@com ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 六 2022-02-12 12:11:56 CST; 3h 54min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1274 (sshd)
Tasks: 1
CGroup: /system.slice/sshd.service
└─1274 /usr/sbin/sshd -D
如上第二行的enable表示开机自启动,第三行的active表示正在运行,常见状态有:
- active(running):正有该服务的一个进程或多个进程正在系统中运行
- active(exited):仅执行一次就正常结束的服务,目前没有任何进程在系统中执行
- active(waiting):正在运行当中,不过还需要等待其它事件发生才能继续运行
- inactive:该服务没有运行
除了enable/disable外还有:
- enable:该服务开机自启动
- disable:开机不启动
- static:该服务不可以自己启动,只能被其他服务唤醒
- mask:该服务无论如何都不能启动,使用systemctl mask unit设置的
查看系统上所以的服务:systemctl [command] [--type=TYPE] [--all]
- systemctl:列出系统上所有启动的服务,同systemctl list-units,加上--all也列出未启动的
- systemctl list-unit-files:依据/usr/lib/systemd/system内的文件,列出所有已经安装的服务
通过systemctl管理不同的操作环境:systemctl [command] [unit.target]
command有:
- get-default:取得目前的target
- set-default:设置后面的target为默认的操作环境
- isolate:立即切换到后面的环境
其中target常用的有:
- multi-user.target:纯命令行模式
- graphical.target:图形界面,包含了命令行界面
- rescue.target:紧急救援模式
- emergency.target:紧急模式
- shutdown.target:关机模式
为了方便起见,systemd提供了几个简单的命令用于切换模式:
- systemctl poweroff:关机模式
- systemctl reboot:重启模式
- systemctl suspend:进入挂起模式,将数据保存在内存中,关闭大部分的硬件,唤醒的速度快
- systemctl hibernate:进入休眠模式,系统的状态保存到硬盘中,唤醒速度慢
- systemctl rescue:进入紧急救援模式
- systemctl emergency:进入紧急模式
分析各服务之间的依赖性:systemctl list-dependencies [unit] [--revers]
我们可以编写自己的shell脚本,在配置文件那三个目录中的随便一个写入我们自己的配置文件,用来管理我们的脚本,即可实现自定义服务
3.3timer定时任务
CentOS7的新特性timer,也是交给systemd服务来管理。
首先需要满足如下条件:
- 系统服务timers.target一定要启动
- 我们自定义的服务my_service.service,该服务的内容就是执行我们的定时任务
- 要有一个my_service.service的时间启动服务,名字是和要执行的服务一样
只需要把配置文件中的[Service]改为[Timer],常用选项如下:
1.单调定时器:
- OnActiveSec:相当于本时间单元被启用的时间点,如当前的mytime.timer启动后20分钟开始执行
- OnBootSec:相对于服务器被启动的时间点
- OnStartupSec:表示相对于systemd服务被启动的时间点
- OnUnitActiveSec:最后一次启动再隔多久再启动一次
- OnUnitInactiveSec:最后一次启动停止后再隔多久再启动一次
2.日历定时器
- OnCalendar:时间单位,和crontab -e文件中类似
时间格式为:星期 年-月-日 时:分:秒
如:
Thu,Fri 2022-*-1,5 11:12:13 表示2022年任意月份的1号5号如果为星期四或星期五的话则在11:12:13执行
*-*-* *:*:00 表示每分钟
*-*-* *:*:00 表示每天
*-01,07-01 00:00:00表示每半年
*:0/15 表示每15分钟,/表示每隔,0/15表示从0开始每15分钟隔一次
还可以使用now、daily、tomorrow、hourly、today、weekly、monthly来表示时间
- Unit:要执行的单元,通常不用,一般使用my_service.service+my_service.timer的方式
- Persistent:当使用OnCalendar的设置时,指定该功能要不要持续进行的意思,设置为yes的话就是类似anacron的功能
- systemctl list-timers:查看所有的timer单元