目录
一、进程和内存管理
进程是操作系统资源管理的基本单位,每个进程都有自己的内存空间、打开的文件、程序计数器和其他执行所需的资源。
1、进程基本概念
1.1、进程ID(PID):
- 每个进程都有唯一的标识符,用于区分不同的进程,进程之间是相互独立的。
- 每个进程都有独立的内存与资源,创建和切换进程的资源消耗较大。
- 每个进程都有一个父进程(PPID),它是创建该进程的进程。
1.2、线程(Thread):
- 线程是进程内的一个执行单元,一个进程可以包含多个线程,
- 同一个进程中的所有线程共享该进程的内存和资源。
- 线程的创建和切换的资源消耗较小。
- 多线程可以并发执行。
1.3、进程使用内存的问题
- 内存泄漏:进程在使用堆内存(通过malloc或new分配的内存)时未能正确释放内存,可能会导致内存泄漏,消耗系统内存。
- 栈溢出:每个进程都有一个栈区域,用来存储函数调用的返回地址、局部变量和参数。当递归调用过深,或分配过大的局部变量时,就会发生栈溢出。
- OOM Killer:当系统没有足够的物理内存,Linux内核会尝试杀掉某些进程来释放内存,通常是杀掉占用内存最多的进程。
1.4、进程状态:
操作系统会根据进程的执行情况对进程进行状态管理,进程的状态会随着系统调度、进程等待资源、执行等因素而不断变化。进程的状态可分为以下几种基本类型:
- 就绪态:所有应用程序初始状态是就绪态,等待调度。
- 运行态:进程被调度并分配CPU资源后,开始执行程序指令,这时进程处于运行态。
- 阻塞态:进程正在等待用户输入、磁盘读写操作或等待其他资源时,会进入阻塞态,等待以上操作完成,才能重新变成就绪态,等待执行。
- 终止态:进程完成任务,退出程序,操作系统回收资源后进入终止态。
进程更多状态:
- R:正在运行(Running)
- S:睡眠(Sleeping)-进程在等待I/O完成。
- D:不可中断睡眠(Uninterruptible Sleep)-I/O等待,不可中断。
- Z:僵尸(Zombie)-进程已终止,但父进程还没有读取其退出状态。
- T:停止(Stopped)-进程被暂停,通常是通过信号暂停。
1.5、进程间通讯(IPC)
操作系统通常会将不同的程序在不同的地址空间中独立运行,因此进程间是相互隔离的,不能直接访问彼此的内存区域。为了实现协作或数据交换,进程间必须通过某些通信机制来进行交互。
- 管道(Pipe):允许一个进程向另一个进程传输数据。
- 消息队列(Message Queue):允许进程发送和接受消息。
- 共享内存(Shared Memory):多个进程可以共享一块内存区域。
- 信号(Signal):通过信号机制,进程可以向其他进程发送终端或通知。
1.6、进程优先级
优先级越高的进程越优先获得CPU资源。操作系统通过设置和调整进程的优先级来实现资源的有效分配,确保高优先级的进程能够及时执行。
- 静态优先级:进程在创建时就固定了一个优先级(nice值),并且在进程的生命周期内不会发生变化。
- 动态优先级:随时间推移或进程的行为发生变化。
二、进程相关命令
2.1、ps
process的缩写,功能是显示当前系统的进程状态。通常与kill命令搭配使用,以中断和删除不必要的服务进程,避免服务器的资源浪费。
语法格式:ps 参数
-a | 显示所有进程信息 | -f | 显示树状结构 |
-e | 显示环境变量信息 | -u | 以用户为主的格式来显示程序状态 |
-l | 使用详细格式显示程序状态 | -x | 不区分终端主机 |
参考示例:
[root@localhost ~]# ps aux //显示系统中全部进程信息
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128544 7160 ? Ss 21:30 0:03 /usr/lib/systemd/syst
root 2 0.0 0.0 0 0 ? S 21:30 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 21:30 0:00 [kworker/0:0H]
[root@localhost ~]# ps -ef |grep ssh //过滤指定进程信息
root 1246 1 0 21:31 ? 00:00:00 /usr/sbin/sshd -D
root 9053 8917 0 21:32 ? 00:00:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 11175 10138 0 23:15 pts/0 00:00:00 grep --color=auto ssh
[root@localhost ~]# ps aux |sort -rnk 3 //以处理器使用量降序排序
root 9175 0.2 8.9 2726488 166340 ? Sl 21:32 0:13 /usr/bin/gnome-shell
root 9428 0.1 1.3 608644 25464 ? Sl 21:32 0:09 /usr/bin/vmtoolsd -n vmusr
root 791 0.1 0.2 295564 5296 ? Ssl 21:31 0:09 /usr/bin/vmtoolsd
2.2 prtstat
打印指定进程的统计信息。
[root@localhost ~]# prtstat 1246 //显示进程详细信息
Process: sshd State: S (sleeping)
CPU#: 0 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 1246 Parent ID: 1
Group ID: 1246 Session ID: 1246
T Group ID: -1
Page Faults
This Process (minor major): 1322 8
Child Processes (minor major): 0 0
CPU Times
This Process (user system guest blkio): 0.00 0.03 0.00 0.47
Child processes (user system guest): 0.00 0.00 0.00
Memory
Vsize: 115 MB
RSS: 4423 kB RSS Limit: 18446744073709 MB
Code Start: 0x557a76276000 Code Stop: 0x557a7633dad4
Stack Start: 0x7ffe07e2df80
Stack Pointer (ESP): 0x7ffe07e2d558 Inst Pointer (EIP): 0x7ff6edbf7983
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
2.3、top
功能是实时显示系统运行状态,包含处理器、内存、服务、进程等重要信息。
语法格式:top 参数 对象
-b | 使用批处理模式,不进行交互显示 | -s | 使用安全模式,不允许交互式指令 |
-c | 使用显示模式 | -u | 仅显示指定用户ID |
-d | 设置显示的更新速度(默认3秒) | -n | 循环显示的次数 |
-p | 指定进程号 | -H | 所有线程占用资源情况 |
交互命令:
h | 显示帮助画面 | l | 切换显示平均负载和启动时间信息 |
k | 终止一个进程 | m | 切换显示内存信息 |
c | 切换显示命令名称和完整命令行 | t | 切换显示进程和CPU状态信息 |
i | 忽略限制和僵死进程 | M | 根据驻留内存大小进行排序 |
q | 退出程序 | P | 根据CPU使用百分比大小进行排序 |
T | 根据时间/累计时间进行排序 |
参考实例:
[root@localhost ~]# top //以默认格式显示系统运行信息
top - 20:26:51 up 46 min, 2 users, load average: 0.00, 0.10, 0.20
//当前系统时间 运行时间 ,登录的用户 ,系统负载
Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie
//总进程数 ,运行中进程数 ,睡眠进程数 ,停止进程数 , 冻结进程数
%Cpu(s): 2.7 us, 1.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
// us:CPU使用占比,sy:内核占CPU比值,ni:改变优先级进程占CPU比值,id:空闲CPU占比,wa:等待I/O进程占CPU比值,hi:硬中断请求服务占CPU比值,si:软中断请求服务占CPU比值,st:虚拟程序占CPU时间比值
KiB Mem : 1863004 total, 345144 free, 780256 used, 737604 buff/cache
// 物理内存总量, 空闲内存总量,使用的物理内存总量,用作内核缓存的内存总量
KiB Swap: 4194300 total, 4194300 free, 0 used. 911668 avail Mem
// 交换分区内存总量,空闲的交换分区总量, 使用的交换分区总量,缓冲的交换分区总量
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
//PID:进程号,USER:用户,PR NI:优先级,VIRT:虚拟内存,RES:物理内存,SHR:共享内存,S:进程状态,%CPU:CPU占比,%MEM:内存占比,TIME:占用时间比值,COMMAND:进程命令名
1386 root 20 0 313748 41608 21716 S 1.3 2.2 0:03.34 X
2727 root 20 0 3007452 183092 67124 S 1.3 9.8 0:08.71 gnome-shell
699 root 20 0 295564 5284 4036 S 0.7 0.3 0:03.77 vmtoolsd
3164 root 20 0 688344 28764 17656 S 0.7 1.5 0:01.50 gnome-terminal-
2.4、pgrep
process global regular expression print的缩写,功能是用于检索进程PID号。
语法格式:pgrep 参数 服务名称
-d | 设置分隔符 | -u | 根据有效用户ID进行匹配 |
-l | 显示进程名及ID | -P | 匹配父进程ID |
-a | 显示完整格式的进程名 |
参考示例:
[root@localhost ~]# pgrep -l ssh //显示进程名及PID号
1225 sshd
2668 ssh-agent
5881 sshd
[root@localhost ~]# pgrep -d , ssh //以“,”为分隔符显示
1225,2668,5881
[root@localhost ~]# pgrep -u root ssh //匹配有效用户
1225
2668
5881
2.5、pidof
Process identifier of 的缩写,功能是查找服务进程的PID号。
参考示例:
[root@localhost ~]# pidof sshd
5881 1225
2.6、 pstree
display a tree of processes的缩写,功能是以树状图形式显示进程信息,显示效果直观。
语法格式:pstree 参数
-a | 显示完整信息 | -p | 显示进程号 |
-u | 显示用户名 | -h | 特别标明现在执行的程序 |
参考示例:
[root@localhost ~]# 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 ~]# pstree -p |grep ssh //以树状图形式显示检索的进程及进程号
| | | |-ssh-agent(2668)
|-sshd(1225)---sshd(5881)---bash(5885)-+-grep(6274)
[root@localhost ~]# pstree -a //完整信息形式显示全部进程
systemd --switched-root --system --deserialize 22
├─ModemManager
│ └─2*[{ModemManager}]
├─NetworkManager --no-daemon
│ └─2*[{NetworkManager}]
├─VGAuthService -s
├─abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG atlist_
├─abrt-watch-log -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
├─abrtd -d -s
2.7、lsof
list opened files的缩写,功能是查看文件的进程信息。
语法格式:lsof 参数 文件名
-c | 显示指定进程所打开的文件 | +d | 显示目录下被打开的文件 |
-d | 显示占用该文件的进程 | +D | 递归处理所有子文件 |
-p | 显示指定进程号所打开的文件 | -i | 显示符合条件的进程 |
参考示例:
[root@localhost ~]# lsof -i:22 //查看端口占用
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1225 root 3u IPv4 27376 0t0 TCP *:ssh (LISTEN)
sshd 1225 root 4u IPv6 27385 0t0 TCP *:ssh (LISTEN)
sshd 5881 root 3u IPv4 71565 0t0 TCP localhost.localdomain:ssh->192.168.153.1:54624 (ESTABLISHED)
[root@localhost ~]# lsof -p 5881 //列出指定进程号所打开的文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 5881 root cwd DIR 253,0 248 64 /
sshd 5881 root rtd DIR 253,0 248 64 /
sshd 5881 root txt REG 253,0 852856 3534556 /usr/sbin/sshd
sshd 5881 root mem REG 253,0 37168 1572385 /usr/lib64/libnss_sss.so.2
2.8、vmstat
Virtual Memory Statistics的缩写,功能是监视系统资源状态。
语法格式:vmstat 参数 对象
-a | 显示活动内页 | -s | 以表格方式显示资源状态 |
-f | 显示启动后创建的进程总数 | -p | 显示指定硬盘分区状态 |
-d | 报告磁盘状态 | -S | 设置显示信息的单位 |
字段说明:
procs(进程) | Memory(内存) | swap | io | system | cpu |
r:运行队列中进程数量 b:等待IO的进程数量 | swpd:使用虚拟内存大小 free:空闲物理内存大小 buff:缓冲的内存大小 cache:缓存的内存大小 | si:每秒从交换区写到 内存的大小 so:每秒写入交换区的 内存大小 | bi:每秒读取的块数 bo:每秒写入的块数 | in:每秒中断数 cs:每秒上下文切换数 | us:用户进程时间百分比 sy:内核系统进程执行时间百分比 wa:IO等待时间百分比 ID:空闲时间百分比 |
参考示例:
[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
3 0 0 317280 1120 751984 0 0 99 5 84 160 1 1 98 0 0
[root@localhost ~]# vmstat -a //系统整体资源状态
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
2 0 0 317028 484644 742564 0 0 99 5 84 160 1 1 98 0 0
[root@localhost ~]# vmstat -f //自启动后创建的进程总数
6641 forks
[root@localhost ~]# vmstat -p /dev/sda1 //显示指定的硬盘分区状态
sda1 reads read sectors writes requested writes
1987 53429 10 4169
2.9、free
功能是显示系统内存使用量情况,包含物理内存和交换内存的总量、使用量、空闲量情况。
语法格式:free 参数
-b | 显示单位为B | -h | 自动调整合适的显示单位 |
-k | 显示单位为KB | -s | 持续显示内存数据 |
-m | 显示单位为MB |
参考示例:
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1863004 792832 317048 20164 753124 891700
Swap: 4194300 0 4194300
[root@localhost ~]# free -m //以MB为单位显示内存使用量
total used free shared buff/cache available
Mem: 1819 773 309 19 735 871
Swap: 4095 0 4095
[root@localhost ~]# free -hs 3 //以易读的单位显示,每隔3秒刷新一次
total used free shared buff/cache available
Mem: 1.8G 774M 309M 19M 735M 870M
Swap: 4.0G 0B 4.0G
total used free shared buff/cache available
Mem: 1.8G 774M 309M 19M 735M 870M
Swap: 4.0G 0B 4.0G
2.10、iostat
I/O stat的缩写,功能是用于监视系统I/O设备使用情况。
语法格式:iostat 参数 设备名
-c | 显示CPU使用情况 | -t | 显示报告产生时的时间 |
-d | 显示设备利用率 | -x | 设置要统计磁盘设备的扩展参数 |
-k | 以千字节每秒为单位 |
参考示例:
[root@localhost ~]# iostat
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2025年02月18日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.61 0.06 0.69 0.38 0.00 98.27
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.74 81.86 4.57 718184 40087
scd0 0.00 0.12 0.00 1050 0
dm-0 1.55 78.14 4.33 685594 38003
dm-1 0.01 0.25 0.00 2204 0
[root@localhost ~]# iostat -d 2 2 /dev/sda //每隔2秒报告一次指定硬盘的使用情况,共报告2次
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain) 2025年02月18日 _x86_64_ (1 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.73 81.17 4.53 718192 40111
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
2.11、uptime
功能是查看系统总运行时长和系统的平均负载。
语法格式:uptime 参数
-p | 以易读的方式显示 |
-s | 显示本次开机时间 |
参考示例:
[root@localhost ~]# uptime //查看当前系统运行时间及系统平均负载
22:13:07 up 2:32, 3 users, load average: 0.01, 0.02, 0.05
[root@localhost ~]# uptime -p //易读方式显示已运行时间
up 2 hours, 32 minutes
[root@localhost ~]# uptime -s //本次系统开机时间
2025-02-18 19:40:36
三、进程管理
3.1、手动启动进程
- 前台进程:直接在终端中运行命令来启动进程,进程会在当前终端窗口中运行
- 后台进程:通过&符号将命令放到后台执行,运行中的进程通过ctrl+z放到后台,但会停止执行。可以继续执行其他任务。
3.2、进程前台,后台及并行执行命令
- jobs:显示终端后台的作业信息。
- fg:将作业放到前台运行。
- bg:将作业放到后台运行。
- &:将多条命令并行执行。
- ctrl+z:将命令放到后台,但会停止命令。
[root@localhost ~]# dd if=/dev/zero of=/dev/null & //通过&将命令后台执行
[1] 6888
[root@localhost ~]# top //ctrl+z将命令放到后台,并暂停执行
[root@localhost ~]# jobs //查看后台作业信息
[1]- 运行中 dd if=/dev/zero of=/dev/null &
[2]+ 已停止 top
[root@localhost ~]# fg 1 //将作业放到前台运行
dd if=/dev/zero of=/dev/null
记录了489645283+0 的读入
记录了489645283+0 的写出
250698384896字节(251 GB)已复制,687.501 秒,365 MB/秒
3.3、结束进程
3.3.1、kill
功能是发送信号到进程
语法格式:kill 参数 进程号
-l | 显示系统支持的信号列表 |
常用信号:
1 | 终端挂断 | 15 | 终止 |
2 | 终断(同ctrl+c) | 18 | 继续 |
3 | 退出(同ctrl+\) | 19 | 暂停(同ctrl+z) |
9 | 强制终止 |
参考示例:
[root@localhost ~]# kill 1225 //结束指定的进程号(PID)
[root@localhost ~]# kill 9 1225 //强制结束指定的进程号(PID)
3.3.2、killall
功能是杀死一组同名进程。
语法格式:killall 参数 服务名
-i | 杀死进程前询问用户是否确认 | -l | 忽略大小写的不同 |
参考示例:
[root@localhost ~]# killall httpd //结束指定服务所对应的全部进程
[root@localhost ~]# killall -9 sshd //强制结束指定服务的全部进程
四、计划任务
4.1、at一次性定时计划任务
功能是设置一次性定时计划任务,会议atd守护进程的形式在后台模式运行。
语法格式:at 参数 对象
-f | 指定包含具体指令的任务文件 | -d | 删除指定的待执行任务 |
-q | 指定新任务的队列名称 | -m | 执行完成后向用户发送邮件 |
-l | 显示待执行任务列表 |
参考示例:
[root@localhost ~]# at 5pm+3 days //三天后的下午5点执行/bin/ls,ctrl+d提交
at> /bin/ls
at> <EOT>
job 1 at Fri Feb 21 17:00:00 2025
[root@localhost data]# at -f zz.sh 11:45 //指定时间执行指定脚本文件
job 4 at Wed Feb 19 11:45:00 2025
[root@localhost data]# atq //查看设置的任务
1 Fri Feb 21 17:00:00 2025 a root
4 Wed Feb 19 11:45:00 2025 a root
[root@localhost data]# atrm 4 //删除已经设置的任务
[root@localhost data]# atq
1 Fri Feb 21 17:00:00 2025 a root
4.2 crontab
功能是管理定时计划任务。
语法格式:crontab 参数 对象
-e | 编辑该用户的计时器设置 | -l | 列出该用户的计时器设置 |
-r | 删除该用户的计时器设置 | -u | 指定要设定计时器的用户名称 |
-i | 删除前询问用户是否确认 |
配置文件:/etc/crontab
[root@localhost data]# 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 //要执行的命令
以上字段中,还可以使用以下特殊字符:
- *(星号):代表所有可能的值。
- ,(逗号):指定一个列表范围,如“1,2,5,7”
- -(中杠):整数之间的中杠表示一个整数范围,如“2-5”表示“2,3,4,5”
- /(正斜线):指定时间的间隔频率,如“0-23/2”表示每两小时执行一次。同时可以和星号一起使用。
参考示例:
[root@localhost data]# crontab -e
no crontab for root - using an empty one
3,15 8-11 */2 * * command //每隔两天的上午8点到11点的第3和第15分钟执行
45 4 1,10,22 * * /etc/init.d/smb restart //每月1、10、22日的4 : 45重启smb
0 23 * * 6 /etc/init.d/smb restart //每星期六的晚上11:00 pm重启smb
crond服务:
[root@localhost data]# systemctl start crond //启动服务
[root@localhost data]# systemctl status crond //查看服务
[root@localhost data]# systemctl stop crond //关闭服务
root@localhost data]# systemctl restart crond //重启服务
[root@localhost data]# systemctl reload crond //重新载入配置
[root@localhost data]# ntsysv //查看crontab服务是否设置为开机启动