Linux进程管理

目录

一、进程和内存管理

1、进程基本概念

1.1、进程ID(PID):

1.2、线程(Thread):

1.3、进程使用内存的问题

1.4、进程状态:

1.5、进程间通讯(IPC)

1.6、进程优先级

二、进程相关命令

2.1、ps

2.2 prtstat

 2.3、top

 2.4、pgrep

2.5、pidof

2.6、 pstree

2.7、lsof

2.8、vmstat

2.9、free

2.10、iostat

2.11、uptime

三、进程管理

3.1、手动启动进程

 3.2、进程前台,后台及并行执行命令

3.3、结束进程

3.3.1、kill

3.3.2、killall

四、计划任务

4.1、at一次性定时计划任务

4.2 crontab


一、进程和内存管理

进程是操作系统资源管理的基本单位,每个进程都有自己的内存空间、打开的文件、程序计数器和其他执行所需的资源。

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(内存)swapiosystemcpu

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服务是否设置为开机启动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值