进程和计划任务
程序
什么是程序
执行特定任务的一串代码
- 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求和信息化工具
- 用于描述进程要完成的功能,是控制进程执行的指令集
进程
什么是进程
运行中的程序的一个副本,是被载入内存的一个指令集和,是资源分配的单位
- 进程ID(Process ID,PID)号码被用来标记各个进程
- UID、GID语境决定文件系统的存取和访问权限
- 通常从执行进程的用户来继承
- 存在生命周期
- 都由其父进程创建
进程的特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命周期的,动态产生和动态消亡的
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是系统进行资源分配和调度的一个独立单位
- 结构性:进程由程序、数据和进程控制块三部分组成
进程优先级
进程的优先级 os
进程优先级调整
-
静态优先级:100-139
-
进程默认启动时的nice值为0,优先级为120
-
只有根用户才能降低nice值(提高优先性)
[root@localhost ~]# nice -n -10 ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.049 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.035 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.036 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.035 ms 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.036 ms 64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.035 ms 64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.036 ms # 切换到新界面查看ping的进程号 [root@localhost ~]# ps axo pid,comm,ni 2098 ping -10 2099 ps 0 [root@localhost ~]# renice -n -20 2098 2098 (进程 ID) 旧优先级为 -10,新优先级为 -20
- RPI(最终值)=PRI(原始值)+NI
RPI值是由内核动态调整的,用户不能直接修改
所以只能通过修改NI值来影响PRI值,间接的调整进程优先级
-
修改NI值时有几个注意事项:
- NI值范围是-20~19
- 普通用户调整NI值的范围是0~19,而且只能调整自己的进程
- 普通用户只能调高NI值,而不能降低,如果原本NI值为0,则只能调整大于0
- 只有root用户才能设定进程NI值为负值,而且可以调整任何用户的进程
NI值越小,进程PRI就会降低,该进程就越优先被CPU处理
NI值越大,进程PRI就会增加,该进程就越靠后被CPU处理
用户进程和终端进程
- 用户进程
用户进程是由普通用户创建并执行的进程
- 终端进程
终端进程是指与终端设备(控制台、虚拟终端、SSH会话等)相关联的进程
-
两者的关联性
- 用户进程通常由终端进程启动的
- 终端进程负责将用户输入传递给用户进程,将用户进程的输出显示在终端设备上
- 用户进程则可以通过终端进程与用户进行交互,并接受用户的输入和输出结果
僵尸进程
当一个子进程终止时,内核会将其相关信息保留在系统中,以供父进程查询
如果如进程没有及时处理这些退出状态信息,子进程就会一直保留在系统中,成为僵尸进程
如何删除僵尸进程
方法一:
[root@localhost ~]# bash
[root@localhost ~]# echo $BASHPID #子进程PID
2716
[root@localhost ~]# echo $PPID #父进程PID
1729
[root@localhost ~]# kill -19 1729 #停止父进程
[root@localhost ~]# kill -9 2716 #关闭子进程
# 打开新的终端控制器
[root@localhost ~]# ps aux #查看子进程状态为僵尸态,STAT为Z
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
root 2716 0.0 0.0 0 0 pts/2 Z+ 18:09 0:00 [bash] <defunct>
[root@localhost ~]# kill -18 1729 #恢复父进程
方法二:
[root@localhost ~]# bash
[root@localhost ~]# echo $BASHPID #恢复后子进程PID更新为1729
2888
[root@localhost ~]# echo $PPID #恢复后父进程PID更新为1723
2845
[root@localhost ~]# ps aux #再次查看,bash对应的进程PID都变更了
[root@localhost ~]# echo $PPID
2932
[root@localhost ~]# echo $BASHPID
2940
线程
线程是进程中的执行路径,共享进程的资源和地址空间
多个线程可以并发执行,实现程序的并发处理
# 查看进程中的线程数
pstree
cd /proc
cd pid
vim status
# 文件中显示Threads: 1 说明此程序为单线程运行
进程和线程的区别
- 进程之间相互独立,线程之间共享资源
- 进程之间通过进程通信交换数据和共享资源,线程之间通过共享内存来通信和共享数据
查看进程信息
- ps命令
- ps输出属性
C : ps -ef 显示列 C 表示cpu利用率
VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集
STAT:进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
I:Idle kernel thread,CentOS 8 新特性
ni: nice值
pri: priority 优先级
rtprio: 实时优先级
psr: processor CPU编号
ps axo pid,cmd,psr,ni,pri,rtprio
-
支持三种选项
- UNIX选项 如: -A , -e
- GNU选项 如:--help
- BSD选项 如:a , ip a
-
常用选项:ps aux(静态查看进程信息)
- a:显示当前终端下的所有进程信息,包括其他用户的进程,与”x“选项结合时将显示系统中所有的进程信息
- u:使用以用户为主的格式输出进程信息
- x:显示但钱用户在所有终端下的进程信息
- -e:显示系统内的所有进程信息
- -l:使用长(long)格式显示进程信息
- -f:使用完整的(full)格式显示进程信息
- k/--sort属性:对属性排序,属性前加”-“表示倒序:ps aux k -%cpu
- o 属性:选项显示定制的信息pid,cmd,%cpu,%men
“ps aux”可以查看系统中所有的进程
“ps -le”可以查看系统中所有的进程,而且还能看到进程的父进程PID和进程优先级
“ps -l”只能看到当前Shell产生的进程
-
ps表头含义
| 表头 | 含义 |
|---|---|
| PID | 进程的ID |
| TTY | 该进程是在哪个终端运行的 |
| TIME | 该进程占用CPU的运算时间,注意不是系统时间 |
| CMD | 产生此进程的命令名 |
- ps aux表头含义
[root@localhost 2940]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128164 6816 ? Ss 16:34 0:00 /usr/lib/systemd/systemd --s
root 2 0.0 0.0 0 0 ? S 16:34 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 16:34 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 16:34 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 16:34 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 16:34 0:00 [rcu_bh]
| 表头 | 含义 |
|---|---|
| USER | 该进程是由哪个用户产生的 |
| PID | 进程的ID |
| %CPU | 该进程占用CPU资源的百分比,占用越高,进程越耗费资源 |
| %MEM | 该进程占用物理内存的百分比,占用越高,进程越耗费资源 |
| VSZ | 该进程占用虚拟内存的大小,单位为KB |
| RSS | 该进程占用实际物理内存的大小,单位为KB |
| TTY | 该进程是在哪个终端运行的 |
| STAT | 进程状态,常见的状态有以下几种 |
| START | 该进程的启动时间 |
| TIME | 该进程占用CPU的运算时间,注意不是系统时间 |
| COMMAND | 产生此进程的命令名 |
- ps -lef 表头含义
[root@localhost 2940]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 32041 ep_pol ? 00:00:00 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
[root@localhost 2940]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 2940 2932 0 80 0 - 29162 do_wai pts/2 00:00:00 bash
0 R 0 3108 2940 0 80 0 - 37235 - pts/2 00:00:00 ps
[root@localhost ~]# ps -lef
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 48425 ep_pol 08:24 ? 00:00:01 /usr/lib/systemd/
1 S root 2 0 0 80 0 - 0 kthrea 08:24 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 08:24 ? 00:00:00 [ksoftirqd/0]
| 表头 | 含义 |
|---|---|
| F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
| S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
| UID | 运行此进程的用户的 ID; |
| PID | 进程的 ID; |
| PPID | 父进程的 ID; |
| C | 该进程的 CPU 使用率,单位是百分比; |
| PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
| NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
| ADDR | 该进程在内存的哪个位置; |
| SZ | 该进程占用多大内存; |
| WCHAN | 该进程是否运行。"-"代表正在运行; |
| TTY | 该进程由哪个终端产生; |
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
| CMD | 产生此进程的命令名; |
- ps aux和ps -ef的区别
| ps aux | ps -ef | |
|---|---|---|
| 排序标准 | 用户 | 进程的启动时间 |
| 输出结果 | 包含更多的列(CPU使用率,内存使用量等) | 包含更多的进程状态相关的列(UID) |
- ps o 指定属性 查看特定属性
[root@localhost 2940]# ps o pid
PID
2940
3322
- ps aux k -pid
[root@localhost 2940]# ps aux --sort=-pid
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3362 0.0 0.0 151200 1944 pts/2 R+ 18:57 0:00 ps aux --sort=-pid
root 3360 0.0 0.0 107904 608 ? S 18:56 0:00 sleep 60
root 3333 0.0 0.0 0 0 ? S 18:54 0:00 [kworker/0:0]
root 3276 0.0 0.0 0 0 ? S 18:49 0:00 [kworker/0:1]
root 3084 0.0 0.0 0 0 ? S 18:28 0:00 [kworker/0:2]
root 2940 0.0 0.1 116648 3264 pts/2 Ss 18:18 0:00 -bash
root 2932 0.0 0.2 147788 5224 ? Ss 18:18 0:00 sshd: root@pts/2
postfix 2812 0.0 0.1 91732 4008 ? S 18:14 0:00 pickup -l -t unix -u
root 2613 0.0 0.0 0 0 ? S 18:00 0:00 [kworker/u256:2]
root 2056 0.0 0.1 116568 3204 pts/0 Ss+ 17:07 0:00 -bash
root 2050 0.0 0.2 147788 5232 ? Ss 17:07 0:00 sshd: root@pts/0
root 1638 0.0 0.1 116568 3200 pts/1 Ss+ 16:35 0:00 -bash
root 1632 0.0 0.2 147788 5224 ? Ts 16:35 0:00 sshd: root@pts/1
gdm 1537 0.0 0.1 299960 3392 ? Sl 16:34 0:00 /usr/libexec/ibus-engine-sim
colord 1516 0.0 0.3 411188 6340 ? Ssl 16:34 0:00 /usr/libexec/colord
gdm 1500 0.0 0.9 1427504 19944 ? Sl 16:34 0:00 /usr/libexec/gnome-settings-
top动态查看进程信息命令
该命令可以动态持续的监听进程的运行状态
并且top命令还提供了一个交互界面,用户可以根据需要,人性化定制自己的输出,进而更清楚的了解进程的运行状态
选项:
- -u 用户名:显示特定用户的进程使用情况
- -p pid:显示特定PID的进程使用情况
- -H:显示进程的线程视图,并按线程ID进行排序
- -o:可以使用不同的排序字段,例如top -o %CPU将使用CPU使用率进行排序
- -n:设置top命令的显示次数或循环次数,例如top -n 2将top命令的输出限制为2次
- -b:以批量处理模式运行top命令,将结果输出到标准输出,适用于脚本和后续处理
- -d:设置刷新间隔,即更新数据的时间间隔,例如top -d 2将每隔2秒刷新一次数据
交互界面指令
- k:杀死选中的进程
- 1:切换到全局统计视图
- m:切换内存使用视图
- t:切换到进程排序模式,可以按不同的字段排序进程列表
第一行为任务队列信息,具体内容如表 所示。
| 内 容 | 说 明 |
|---|---|
| 12:26:46 | 系统当前时间 |
| up 1 day, 13:32 | 系统的运行时间.本机己经运行 1 天 13 小时 32 分钟 |
| 2 users | 当前登录了两个用户 |
| load average: 0.00,0.00,0.00 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) |
第二行为进程信息,具体内容如表
| 内 容 | 说 明 |
|---|---|
| Tasks: 95 total | 系统中的进程总数 |
| 1 running | 正在运行的进程数 |
| 94 sleeping | 睡眠的进程数 |
| 0 stopped | 正在停止的进程数 |
| 0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 |
第三行为 CPU 信息,具体内容如表
| 内 容 | 说 明 |
|---|---|
| Cpu(s): 0.1 %us | 用户模式占用的 CPU 百分比 个人用户开启的进程占用的 cpu 率 |
| 0.1%sy | 系统模式占用的 CPU 百分比 |
| 0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比 |
| 99.7%id | 空闲 CPU 占用的 CPU 百分比 |
| 0.1%wa | 等待输入/输出的进程占用的 CPU 百分比 1 |
| 0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
| 0.1%si | 软中断请求服务占用的 CPU 百分比 |
| 0.0%st | st(steal time)意为虚拟程序占用 cpu 时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息,具体内容如表buff cache
| 内 容 | 说 明 |
|---|---|
| Mem: 625344k total | 物理内存的总量,单位为KB |
| 571504k used | 己经使用的物理内存数量 |
| 53840k&ee | 空闲的物理内存数量。我们使用的是虚拟机,共分配了 628MB内存,所以只有53MB的空闲内存 |
| 65800k buffers | 作为缓冲的内存数量 |
第五行为交换分区(swap)信息,如表
| 内 容 | 说 明 |
|---|---|
| Swap: 524280k total | 交换分区(虚拟内存)的总大小 |
| Ok used | 已经使用的交换分区的大小 |
| 524280k free | 空闲交换分区的大小 |
| 409280k cached | 作为缓存的交换分区的大小 |
pgrep命令
查看指定的进程
- -U 指定用户
- -l: 显示进程名
- -a: 显示完整格式的进程名
- -P pid: 显示指定进程的子进程
[root@localhost 2940]# pgrep -l "log"
412 xfs-log/dm-0
608 xfs-log/sda1
712 systemd-logind
718 abrt-watch-log
762 abrt-watch-log
766 rsyslogd
[root@localhost 2940]# useradd zhangsan
[root@localhost 2940]# pgrep -l -U zhangsan
pstree以树状结构显示当前系统中运行的进程
命令格式
- pstree :不加参数默认显示所有进程
- pstree 选项 PID:显示指定PID的进程
- pstree 选项 用户名:显示指定用户的进程
选项:
- -a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
- -p:显示PID
- -T:不显示线程thread,默认显示线程
- -u:显示用户切换
- -H pid:高亮显示指定进程及其所有父辈进程
[root@localhost 2940]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─3*[{at-spi-bus-laun}]
....
[root@localhost 2940]# pstree -p root
systemd(1)─┬─ModemManager(708)─┬─{ModemManager}(734)
│ └─{ModemManager}(757)
├─NetworkManager(795)─┬─{NetworkManager}(808)
│ └─{NetworkManager}(813)
五大性能
| 内存使用率 | free,top |
|---|---|
| cpu使用率 | w,top,ps,iostat,uptime |
| 硬盘使用率 | df |
| 硬盘读写性能 | dd,iostat |
| 网络带宽 | iftop |
lsof
lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
lsof [选项]
| 选项 | 功能 |
|---|---|
| -c 字符串 | 只列出以字符串开头的进程打开的文件。 |
| +d 目录名 | 列出某个目录中所有被进程调用的文件。 |
| -u 用户名 | 只列出某个用户的进程打开的文件。 |
| -p pid | 列出某个 PID 进程打开的文件。 |
-
过滤端口
- lsof -i :端口号
[root@localhost ~]# lsof -i:80
- 如果有就确定端口被打开
- 确认远端服务器端口是否被打开
假如:如何知道192.168.91.1上的5555端口被打开?
telnet 192.168.91.100 5555
内存
- buff/cache共享缓存空间
内存独立出部分空间用于存取缓存数据,当满足系统设定的条件后自动将数据存放至硬盘中。
free -h可以查看buff/cache占用情况
- 如何清理缓存
free -h
free -m #以m为单位查看
cd proc/sys/vm #找到缓存路径
ls #查看vm文件夹下的文件或文件夹
cat drop_caches #查看缓存文件夹内容
pwd #查看当前文件夹路径
echo 3 >/proc/sys/vm/drop_caches
vmstat监控系统资源,虚拟资源
[root@localhost ~]# 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 1301648 2116 396752 0 0 38 3 33 33 0 0 100 0 0
- 下表罗列出了 vmstat 命令的第二种基本格式中常用的选项及各自的含义。
| 选项 | 含义 |
|---|---|
| -fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
| -S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
| -d | 列出硬盘有关读写总量的统计表。 |
| -p 分区设备文件名 | 查看硬盘分区的读写情况。 |
| 字段 | 含义 |
|---|---|
| procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
| memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。-buff:缓冲的内存容量,单位为 KB。-cache:缓存的内存容量,单位为 KB。 |
| swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
| io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。 |
| system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。这两个数越大,代表系统与接口设备的通信越繁忙。 |
| cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
- iostat
iostat 可以提供更丰富的IO性能状态数据
此工具由sysstat包提供
常用选项:
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
例子:
[root@localhost ~]#iostat 1 -d /dev/sda
#只看 sda硬盘
Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2023年07月27日 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 288.01 19561.04 7282.13 27750860 10331013
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.00 8.00 0.00 8 0
- 监视磁盘I/O iotop(需要额外安装)
iotop
dd if=/dev/zero of=/dev/null
iftop -ni ens33
#网络流量
网页客户端
wget https://prdownloads.sourceforge.net/webadmin/webmin-1.955-1.noarch.rpm
yum -y install webmin-1.955-1.noarch.rpm
service webmin start
ss -ntl
默认用户:root 密码:123123
uptime 系统运行了多久时间
[root@localhost ~]#uptime
01:29:00 up 2:07, 6 users, load average: 0.00, 0.01, 0.05
当前时间 运行时间 登录用户
系统资源统计 dstat
yum install dstat -y
webadin
yum install webmin-2.100-1.noarch.rpm -y
rpm -q webmin
systemctl start webmin
systemctl status webmin
https://192.168.91.100:10000/
root
自己系统的密码
进程管理
手动启动进程
前台执行:会影响当前的操作
后台执行:不会影响当前的操作
| 命令 & | 将前台命令放入后台执行 |
|---|---|
| 命令 ctrl+z | 将运行中的前台命令放入后台挂起 |
| jobs | 后台任务列表,会显示序号 |
| bg 序号 | 继续运行后台的命令 |
| fg 序号 | 调出后台任务 |
并行执行任务
[root@localhost ~]#ping 127.0.0.1&ping 127.0.0.2&ping 127.0.0.3&
killall ping
screen
nohup ping 127.0.0.1
#!/bin/bash
host="192.168.91."
for i in {1..254}
do
{
ping -c1 -w1 $host$i &>/dev/null && echo $host$i is up || echo $host$i is down
}&
done
wait
结束进程
kill
kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
kill [信号] PID
kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,读者可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号
1) SIGHUP 无须关闭进程而让其重读配置文件
2) SIGINT 中止正在运行的进程;相当于Ctrl+c 3) SIGQUIT 相当于ctrl+\ 9) SIGKILL 强制杀死正在运行的进程,可能会导致数据丢失,慎用!
9) 关电源 数据库 写
15) SIGTERM 终止正在运行的进程,默认信号
18) SIGCONT 继续运行
19) SIGSTOP 后台休眠
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
[root@localhost data]#trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
计划任务
- 一次性计划任务:at
at [option] TIME
at [选项] [时间]
[HH:MM] [yyyy-mm-dd]
HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00
HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2023-10-20
HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该
项任务
now + 5 min
02pm + 3 days
| 格式 | 用法 |
|---|---|
| HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 |
| Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 |
| Noon(noon) | 代表 12:00 PM(相当于 12:00)。 |
| Teatime(teatime)下午茶 | 代表 4:00 PM(相当于 16:00)。 |
| 英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 |
| MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 |
| now+时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。 |
- 周期性计划任务:crontab
[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 Tue 2022-03-01 21:23:18 CST; 3h 28min ago
Main PID: 1067 (crond)
CGroup: /system.slice/crond.service
└─1067 /usr/sbin/crond -n
Mar 01 21:23:18 localhost.localdomain systemd[1]: Started Command Scheduler.
Mar 01 21:23:18 localhost.localdomain systemd[1]: Starting Command Scheduler...
Mar 01 21:23:18 localhost.localdomain crond[1067]: (CRON) INFO (RANDOM_DELAY will be scaled with facto...d.)
Mar 01 21:23:18 localhost.localdomain crond[1067]: (CRON) INFO (running with inotify support)
Hint: Some lines were ellipsized, use -l to show in full.
#################
crontab [选项] [file]
###############
| 选项 | 功能 |
|---|---|
| -u user | 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
| -e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 |
| -l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 |
| -r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 |
| -i | 在删除用户的 crontab 文件时,给确认提示。 |
crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务
| 项目 | 含义 | 范围 |
|---|---|---|
| 第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
| 第二个"*" | 一天当中的第几小时(hour) | 0~23 |
| 第三个"*" | 一个月当中的第几天(day) | 1~31 |
| 第四个"*" | 一年当中的第几个月(month) | 1~12 |
| 第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
在时间表示中,还有一些特殊符号需要学习
| 特殊符号 | 含义 |
|---|---|
| *(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
| ,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
| -(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
| /(正斜线) | 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令。 |
每月的 1号 15号 30号
* * 1,15,30 * *
中午 12点 - 16点
* 12-16/2 * * *
每 半小时 执行 一次
30 * * * *
[root@localhost opt]#cat /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
创建计划任务
crontab -u zhnagsan -e
#注意权限
*/2 * * * * /usr/bin/cp /etc/passwd /opt/
#每两分钟执行脚本
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
*/2 * * * * /usr/bin/cp /etc/passwd /opt/
30 2 * * * /bin/cp -a /etc/ /data/etc`date +%F_%T`
30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 有问题 执行不了
在书写 crontab 定时任务时,需要注意以下几个事项:
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。