linux进程管理

Posted inmeditation

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux进程管理相关的知识,希望对你有一定的参考价值。

了解进程

进程定义

  • 已经启动的可执行的运行实例

组成

  • 已经分配内存的地址空间
  • 安全属性,包括所有权凭据和特权
  • 程序代码的一个或多个执行线程

程序和进程的区别

  • 程序:二进制文件
  • 进程:是程序运行时的过程,动态,有生命周期及运行状态

进程的生命周期

父进程复制自己的地址空间,创建一个新的子进程. 每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性只需.  PID和父进程(PPID)是子进程环境的元素 . 任何进程都可以创建子进程

所有进程都是第一个系统进程的后代

  • centos5,6的PID为1的进程是init
  • centos7的PID为1的进程是systemd

僵尸进程

  • 父进程退出了,子进程没有退出.这些子进程没有父进程来管理,就变成了僵尸进程

查看进程

PS -aux

常用的参数

  • a: 显示跟当前终端关联的所有进程
  • u: 基于用户的格式显示
  • x: 显示所有进程,不以终端机来区分

[root@VM_0_15_centos ~]# ps -aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oot 1 0.0 0.3 191008 3624 ? Ss Aug13 2:02 /usr/lib/systemd/systemd --switched-ro
root 2 0.0 0.0 0 0 ? S Aug13 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Aug13 0:31 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Aug13 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Aug13 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Aug13 0:00 [rcu_bh]
选项 概述
user 启动这些进程的用户
pid 进程的id
%cpu 进程占用cpu百分比
%men 进程占用内存的百分比
vsz 进程占用的虚拟内存大小(单位kb)
rss 进程占用的物理内存大小(kb)
tty 进程在哪个终端上运行
stat 该进程目前的状态
start 被触发启动的时间
time 实际使用cpu运作的时间,有显示0:00的,耗费cpu资源不到1秒
command 该程序的实际指令

stat选项详解

  • R:该程序目前正在运行,或者可被运行
  • S:该程序目前正在睡眠
  • T:该程序目前正在侦测或者停止了,
  • Z:该程序应该已经终止,但是其父进程无法正常的终止他,造成zombie僵尸程序的状态
  • D:不可中断状态|

五个基本状态后面还可以加一些字母

  • <:表示进程运行在高优先级上
  • N:表示进程运行在低优先级上
  • L:表示进程有页面锁定在内存中
  • s:表示进程是控制进程
  • l:表示进程是多线程的
  • +:表示当前进程运行在前台

tty选项详解

  • ?:表示与终端没有关系,大部分是内核的
  • tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示由网络连接进主机的程序(是虚拟的)

ps -ef

  • -e: 显示所有进程
  • -f: 显示完整格式输出

[root@VM_0_15_centos ~]# ps -ef

UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug13 ? 00:02:02 /usr/lib/systemd/systemd --switched-root --system --des
root 2 0 0 Aug13 ? 00:00:00 [kthreadd]
root 3 2 0 Aug13 ? 00:00:31 [ksoftirqd/0]
root 5 2 0 Aug13 ? 00:00:00 [kworker/0:0H]
root 7 2 0 Aug13 ? 00:00:00 [migration/0]
选项 概述
UID 启动这些进程的用户
PID 进程的ID
PPID 父进程的ID号
C 进程生命周期的利用率
Stime 启动启动时的系统时间
tty 进程在哪个终端上运行
time 运行进程累计需要的cpu时间
cmd 启动的程序名称

uptime

查看系统负载

[root@VM_0_15_centos ~]# uptime
 19:36:10 up 13 days,  3:47,  1 user,  load average: 0.00, 0.01, 0.05
选项 概述
19:36:10 当前时间
up 13 days 系统运行时间,说明这台服务器已经开机13天了
1 user 当前登录的用户数
load average: 0.00, 0.01, 0.05 cpu系统负载,即cpu任务队列的平均长度,三个数值分别是1分钟,5分钟,15分钟的平均值

互动:

找出当前系统中,cpu负载过高的服务器
服务器:load average 0.15, 0.08, 0.01         1核
服务器:load average 4.15, 6.08, 6.01        1核
服务器:load average 10.15, 10.08, 10.01    4核
 
答案:4核
经验:单核心,1分钟的系统平均负载不差过3,就可以,这是个经验值

top

[root@VM_0_15_centos ~]# top
top - 19:42:40 up 13 days,  3:54,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  74 total,   2 running,  72 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.0 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1014888 total,    65276 free,   108852 used,   840760 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   733124 avail Mem 


  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                            
 3504 root      20   0  611428  13364   1972 S  0.7  1.3  64:16.54 barad_agent                        
14759 root      20   0  146564  10968   3112 S  0.3  1.1   1:14.98 YDService                          
    1 root      20   0  191008   3624   2284 S  0.0  0.4   2:02.70 systemd                            
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.08 kthreadd                           
    3 root      20   0       0      0      0 S  0.0  0.0   0:31.08 ksoftirqd/0                        
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H                       
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0    
  • 第一行,系统负载
  • 第二行,进程信息
    • tesks(当前任务数)
    • running 运行
    • sleeping 睡眠
    • stopped 终止
    • zombie 僵尸进程
  • 第三行cpu信息
    • us:用户占用cpu的时间
    • sy:内核占用cpu
    • ni:用户进程空间内改变过优先级占用的cpu
    • id:空闲cpu的百分比
    • wa:当对磁盘进行大量写时,发现IO等待会占用很多cpu,如果正常使用占用比较多cpu,磁盘性能有问题
    • hi:硬件中断占用的cpu,硬件驱动通常是内核中的一个子进程,而不是一个独立的进程
    • si:软中断,占用的cpu百分比,往磁盘写入数据有个队列,所占用的时间
    • st:虚拟机占用物理机cpu时间
  • 第四行内存信息
    • 单位kb
    • total 总内存
    • free 空闲
    • used 占用
    • buff/cache 这里的缓存是可以释放的
  • 第五行 swap
    • total 交换区总量
    • free 空闲的交换区总量
    • used 使用的交换区总量
    • avail Mem 总共的可利用内存是多少
    • 注意:如果swap分区,被使用,那么你的内存不够用了
选项 概述
PID 进程ID
USER 进程所有者
PR 优先级
NI nice值
VIRT 进程使用的虚拟内存总量
RED 进程使用的物理内存总量
SHR 共享内存大小
S 进程状态
%CPU 进程占用的CPU百分比
%MEM 进程占用的物理内存百分比
TIME+ 进程使用的CPU总时间
COMMAND 命令行

快捷键

  • 默认 3s 刷新一次
  • 按s修改刷新时间
  • 按空格立即刷新
  • 按大写的 C 按照cpu占用排序
  • 按大写的 M 安装内存占用排序
  • 按数字键1,显示每个内核的cpu使用频率
  • 按u: 显示指定的用户
  • h:帮助
  • q:退出

例:-p通过进程ID查看单个进程

[root@VM_0_15_centos ~]# top -p 3081

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                
 3081 root      20   0  112864   4304   3284 S  0.0  0.4   0:59.84 sshd    

例:找出系统中占用系统进程最多的进程

top命令执行后按大写的P

[root@VM_0_15_centos ~]# top
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                
 2438 polkitd   20   0  614312  10460   1992 S  0.2  1.0   0:30.25 polkitd                                
 3504 root      20   0  611428  13364   1972 S  0.2  1.3  64:21.77 barad_agent                            
14759 root      20   0  146876  11204   3112 S  0.2  1.1   1:18.95 YDService 

在linux系统中最多可以使用100%CPU吗

理论上:如果你是4核心的cpu,你可以运行400%

lsof命令

选项

  • -p 进程号,列出指定进程号打开的文件
  • -i 条件:列出符合条件的进程

查看某个进程读了那些文件,调用了那些东西呢,一般用于木马进程

[root@VM_0_15_centos ~]# ps aux | grep ssh | grep -v grep
root       448  0.0  0.5 156744  5440 ?        Ss   16:43   0:00 sshd: root@pts/0
root      3081  0.0  0.4 112864  4304 ?        Ss   Aug13   1:02 /usr/sbin/sshd -D
root      8557  0.0  0.5 156624  5120 ?        Ss   17:53   0:00 sshd: unknown [priv]
sshd      8558  0.3  0.2 112864  2224 ?        S    17:53   0:00 sshd: unknown [net]
[root@VM_0_15_centos ~]# lsof -p 3081
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
sshd    3081 root  cwd    DIR              253,1     4096        2 /
sshd    3081 root  rtd    DIR              253,1     4096        2 /
sshd    3081 root  txt    REG              253,1   853040    16204 /usr/sbin/sshd
sshd    3081 root  mem    REG              253,1    61624    22098 /usr/lib64/libnss_files-2.17.so
...

查看端口,或者看黑客开启的后门端口是哪个进程在使用

[root@VM_0_15_centos ~]# lsof -i:22
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd     448 root    3u  IPv4 13695793      0t0  TCP VM_0_15_centos:ssh->144.0.8.26:9545 (ESTABLISHED)
sshd    3081 root    3u  IPv4    22003      0t0  TCP *:ssh (LISTEN)

pstree

以树形图显示进程,只显示进程的名字,且相同进程合并显示

[root@VM_0_15_centos ~]# pstree
systemd─┬─YDLive───YDLive
        ├─YDService───11*[YDService]
        ├─acpid
        ├─2*[agetty]
        ├─atd
        ├─auditd───auditd
        ├─barad_agent─┬─barad_agent
        │             └─barad_agent───3*[barad_agent]
        ├─crond
        ├─dbus-daemon
        ├─dhclient
        ├─lsmd
        ├─lvmetad
        ├─ntpd
        ├─polkitd───6*[polkitd]
        ├─rsyslogd───2*[rsyslogd]
        ├─sgagent───sgagent
        ├─sshd─┬─sshd───bash───pstree
        │      └─sshd───sshd
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[tuned]

pstree -p 进程ID

[root@VM_0_15_centos ~]# pstree -p 3081
sshd(3081)───sshd(448)───bash(493)───pstree(9591)

# 管理进程

通过信号来管理进程

列出所有信号

[root@VM_0_15_centos ~]# kill -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    

常用的信号

信号编号 信号名 解释
1 SIGHUP 重新加载配置
2 SIGINT 键盘中断ctrl+c
3 SIGQUIT 退出
9 SIGKILL 强制退出
15 SIGTERM 终止(正常结束),缺省信号
18 SIGCONT 继续
19 SIGSTOP 停止
20 SIGTSTP 暂停 ctrl+z

关闭进程

  • 1,kill [信号] [进程ID]
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
root     10472  0.0  0.2 159780  2188 pts/1    S+   18:10   0:00 top
[root@VM_0_15_centos ~]# kill 3 10472
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
  • 2,killall 和 pkill 命令通过指定名字来杀死进程

killall

[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
root     11480  0.0  0.2 159780  2148 pts/1    S+   18:18   0:00 top
[root@VM_0_15_centos ~]# killall top
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
[root@VM_0_15_centos ~]# 

pkill

[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
root     11676  0.0  0.2 159780  2144 pts/1    S+   18:20   0:00 top
[root@VM_0_15_centos ~]# pkill top
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
[root@VM_0_15_centos ~]# 

进程优先级管理

优先级的取值范围(-20,19),越小优先级越高,默认优先级是0

设置优先级,通过ctrl+z挂起进程

[root@VM_0_15_centos ~]# nice -n 5 vim h.txt

[1]+  Stopped                 nice -n 5 vim h.txt

查看进程的PID

[root@VM_0_15_centos ~]# ps aux | grep vim | grep -v grep
root     12206  0.0  0.4 151272  4944 pts/0    TN   18:24   0:00 vim h.txt

根据PID查看进程的信息

[root@VM_0_15_centos ~]# top -p 12206
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                
12206 root      25   5  151272   4944   2584 T  0.0  0.5   0:00.02 vim  

可以发现优先级是5

前台后台进程切换

&用在一个命令的最后,可以把这个命令放到后台执行

[root@VM_0_15_centos ~]# top &
[2] 13061

?ctrl + z可以将一个正在前台执行的程序放到后台

[root@VM_0_15_centos ~]# ll > ./123.txt
[root@VM_0_15_centos ~]# tail -f ./123.txt 
-rw-r--r-- 1 root root      136 Aug 24 23:25 2.txt
-rw-r--r-- 1 root root       49 Aug 24 23:23 a.txt
-rw-r--r-- 1 root root       50 Aug 24 14:12 b.txt
-rw-r--r-- 1 root root       12 Aug 24 23:05 cpu.txt
-rw-r--r-- 1 root root 52428800 Aug 24 23:16 c.txt
drwxr-xr-x 2 root root     4096 Aug 21 21:22 DES_DIR
-rw-r--r-- 1 root root       97 Aug 24 23:07 eof.sh
-rw-r--r-- 1 root root      275 Aug 21 21:38 packups.sh
-rw-r--r-- 1 root root      146 Aug 21 21:47 ping.sh
-rw-r--r-- 1 root root      292 Aug 21 21:59 useradd1.sh
^Z
[4]+  Stopped                 tail -f ./123.txt

jobs查看当前有多少在后台运行的进程,这是一个作业控制命令

[root@VM_0_15_centos ~]# jobs
[1]   Stopped                 nice -n 5 vim h.txt
[2]   Stopped                 top
[3]-  Stopped                 top
[4]+  Stopped                 tail -f ./123.txt

?

fg命令将后台中的命令调到前台继续运行,

如果后台中有多个命令可以用 fg %jobnumber将选中的命令调出,
%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)?

[root@VM_0_15_centos ~]# fg 4
tail -f ./123.txt

我们再次远程,进行更改文件

[root@VM_0_15_centos ~]# ls >> 123.txt 

发现在监视改文件

[root@VM_0_15_centos ~]# fg 4
tail -f ./123.txt
123.txt
1.txt
2.txt
a.txt
b.txt
cpu.txt
c.txt
DES_DIR
eof.sh
packups.sh
ping.sh
useradd1.sh

bg命令将一个在后台中暂停的进程,变成继续执行,用法同上

实战:使用screen后台实行执行命令备份命令

场景:公司晚上需要备份1t数据,我再xshell上直接执行备份脚本back.sh可以吗?
或直接运行back.sh&放到后台运行可以吗?
当关了xshell,back.sh&还在后台执行吗?

xshell长时间连接,如果本地网络偶尔断开或者xshell不小心关闭,都会让后台运行的备份命令停止运行的

  • 正确做法使用:screen

安装

[root@VM_0_15_centos ~]# yum install screen -y

?

用法:
执行screen,将打开一个全新的会话
运行你的备份任务,或者vim a.txt命令
这时可以键入快捷键ctrl+a+d??
就已经分离出一个单独的会话

[root@VM_0_15_centos ~]# screen
[detached from 15042.pts-0.VM_0_15_centos]

screen -ls 查看已经建立的会话id

[root@VM_0_15_centos ~]# screen -ls
There is a screen on:
    15042.pts-0.VM_0_15_centos  (Detached)
1 Socket in /var/run/screen/S-root.

[root@VM_0_15_centos ~]# 

通过PID 重新连接会话

[root@VM_0_15_centos ~]# screen -r 15042

创建会话时也可以指定名称

[root@VM_0_15_centos ~]# screen -S text

当不想使用screen会话了,exit退出

[root@VM_0_15_centos ~]# exit

以上是关于linux进程管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

Linux性能及调优指南(翻译)之Linux进程管理

linux进程管理

Linux进程管理专题

linux进程管理

Linux 进程管理 进程优先级管理