LinuxDay14——进程管理

Posted Welcome My blog

tags:

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

程相关概念

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等

Process: 运行中的程序的一个副本,是被载入内存的一个指令集合

  进程ID(Process ID,PID)号码被用来标记各个进程

  UID、GID、和SELinux语境决定对文件系统的存取和访问权限,

  通常从执行进程的用户来继承

  存在生命周期

task struct:Linux内核存储进程信息的数据结构格式

task list:多个任务的的task struct组成的链表

进程创建

  init:第一个进程

  父子关系

  进程:都由其父进程创建,CoW

  fork(), clone()

进程内存

  Page Frame: 页框,用存储页面数据,存储Page 4k

  LRU:Least Recently Used 近期最少使用算法,释放内存

  物理地址空间和线性地址空间

  MMU:Memory Management Unit负责转换线性和物理地址

  TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存

IPC: Inter Process Communication

 同一主机: signal:信号

  shm: shared memory

  semaphore:信号量,一种计数器

 不同主机:socket: IP和端口号

  RPC: remote procedure call

  MQ:消息队列,Kafka,ActiveMQ

进程的基本状态

 

创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行

执行状态:进程处于就绪状态被调度后,进程进入执行状态

阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用

终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

状态之间转换六种情况

运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态

进程优先级

 系统优先级:数字越小,优先级越高

  0-139(CentOS4,5)

    各有140个运行队列和过期队列

  0-98,99(CentOS6)

 实时优先级: 99-0 值最大优先级最高

 nice值:-20到19,对应系统优先级100-139或99

Big O:时间复杂度,用时和规模的关系

 O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

LRU算法

 

进程状态

Linux内核:抢占式多任务

进程类型:

  守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

  前台进程:跟终端相关,通过终端启动的进程

  注意:两者可相互转化

进程状态:

  运行态:running

  就绪态:ready

  睡眠态:

   可中断:interruptable

   不可中断:uninterruptable

  停止态:stopped,暂停于内存,但不会被调度,除非手动启动

  僵死态:zombie,结束进程,父进程结束前,子进程不关闭

系统管理工具

PS命令:选项:默认显示当前终端中的进程

支持三种选项:

 GNU选项 如--help

 BSD选项 如a

  a 选项包括所有终端中的进程

  x 选项包括不链接终端的进程

  u 选项显示进程所有者的信息

  f 选项显示进程树,相当于 --forest

  k|--sort 属性 对属性排序,属性前加- 表示倒序

  o 属性… 选项显示定制的(需要配合使用) 默认当前终端进程

  L 显示支持的属性列表

 UNIX选项 如-A -e

  -C cmdlist 指定命令,多个命令用,分隔

  -L 显示线程

  -e: 显示所有进程,相当于-A

  -f: 显示完整格式程序信息

  -F: 显示更完整格式的进程信息

  -H: 以进程层级格式显示进程相关信息

  -u userlist 指定有效的用户ID或名称 euser

  -U userlist 指定真正的用户ID或名称 ruser

  -g gid或groupname 指定有效的gid或组名称

  -G gid或groupname 指定真正的gid或组名称

  -p pid 显示指pid的进程

  --ppid pid 显示属于pid的子进程

  -M 显示SELinux信息,相当于Z

ps输出属性

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,会话(子进程)发起者

 

  ni: nice值

  pri: priority 优先级

  psr: processor CPU编号

  rtprio: 实时优先级

常用组合

  aux

  -ef

  -eFH

  -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

  axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

进程优先级

进程优先级调整:

  静态优先级:100-139

  进程默认启动时的nice值为0,优先级为120

  只有根用户才能降低nice值(提高优先性)

nice命令:

  nice [OPTION] [COMMAND [ARG]...]

renice命令:

  renice [-n] priority pid...

查看:

  ps axo pid,comm,ni

搜索进程

最灵活:ps 选项 | 其它命令

按预定义的模式:pgrep

  pgrep [options] pattern

  -u uid: effective user,生效者

  -U uid: real user,真正发起运行命令者

  -t terminal: 与指定终端相关的进程

  -l: 显示进程名

  -a: 显示完整格式的进程名

  -P pid: 显示指定进程的子进程

按确切的程序名称:/sbin/pidof

查看进程编号

pidof bash

系统工具

uptime

显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)

系统平均负载:

指在特定时间间隔内运行队列中的平均进程数

通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题

如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用

 

top

排序

  P:以占据的CPU百分比,%CPU

  M:占据内存百分比,%MEM

  T:累积占据CPU时长,TIME+

首部信息显示

  uptime信息:l命令

  tasks及cpu信息:t命令

  cpu分别显示:1 (数字)

  memory信息:m命令

退出命令:q

修改刷新时间间隔:s

终止指定进程:k

保存文件:W

栏位信息简介

  us:用户空间

  sy:内核空间

  ni:调整nice时间

  id:空闲

  wa:等待IO时间

  hi:硬中断

  si:软中断(模式切换)

  st:虚拟机偷走的时间

选项:

  -d #: 指定刷新时间间隔,默认为3秒

  -b: 全部显示所有进程

  -n #: 刷新多少次后退出

htop命令:EPEL源

选项:

  -d #: 指定延迟时间;

  -u UserName: 仅显示指定用户的进程

  -s COLUME: 以指定字段进行排序

子命令:

  s: 跟踪选定进程的系统调用

  l: 显示选定进程打开的文件列表

  a:将选定的进程绑定至某指定CPU核心

  t: 显示进程树

内存空间

内存空间使用状态:

free [OPTION]

  -b 以字节为单位

  -m 以MB为单位

  -g 以GB为单位

  -h 易读格式

  -o 不显示-/+buffers/cache行

  -t 显示RAM + swap的总和

  -s n 刷新间隔为n秒

  -c n 刷新n次后即退出

 

 

vmstat命令:虚拟内存信息

vmstat [options] [delay [count]]

vmstat 2 5

procs:

r:可运行(正运行或等待运行)进程的个数,和核心数有关

b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)

memory

swpd: 交换内存的使用总量

free:空闲物理内存总量

buffer:用于buffer的内存总量

cache:用于cache的内存总量

swap:

  si:从磁盘交换进内存的数据速率(kb/s)

  so:从内存交换至磁盘的数据速率(kb/s)

io

  bi:从块设备读入数据到系统的速率(kb/s)

  bo: 保存数据至块设备的速率

system

in: interrupts 中断速率,包括时钟

cs: context switch 进程切换速率

cpu

  us:Time spent running non-kernel code

  sy: Time spent running kernel code

  id: Time spent idle. Linux 2.5.41前,包括IO-wait time.

  wa: Time spent waiting for IO. 2.5.41前,包括in idle.

  st: Time stolen from a virtual machine. 2.6.11前, unknown.

 选项:

  -s: 显示内存的统计数据

iostat:统计CPU和设备IO信息

pmap命令:进程对应的内存映射

  pmap [options] pid [...]

  -x: 显示详细格式的信息

  另外一种实现:

  cat /proc/PID/maps

glances命令:EPEL源

  glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]

 内建命令:

  a Sort processes automatically l Show/hide logs

  c Sort processes by CPU% b Bytes or bits for network I/O

  m Sort processes by MEM% w Delete warning logs

  p Sort processes by name x Delete warning and critical logs

  i Sort processes by I/O rate 1 Global CPU or per-CPU stats

  d Show/hide disk I/O stats h Show/hide this help screen

  f Show/hide file system stats t View network I/O as combination

  n Show/hide network stats u View cumulative network I/O

  s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)

  y Show/hide hddtemp stats

 常用选项:

  -b: 以Byte为单位显示网卡数据速率

  -d: 关闭磁盘I/O模块

  -f /path/to/somefile: 设定输入文件位置

  -o {html|CSV}:输出格式

  -m: 禁用mount模块

  -n: 禁用网络模块

  -t #: 延迟时间间隔

  -1:每个CPU的相关数据单独显示

C/S模式下运行glances命令

服务器模式:

glances -s -B IPADDR

IPADDR: 指明监听的本机哪个地址

客户端模式:

glances -c IPADDR

IPADDR:要连入的服务器端地址

dstat命令:系统资源统计,代替vmstat,iostat

dstat [-afv] [options..] [delay [count]]

  -c: 显示cpu相关信息

  -C #,#,...,total

  -d: 显示disk相关信息

  -D total,sda,sdb,...

  -g:显示page相关统计数据

  -m: 显示memory相关统计数据

  -n: 显示network相关统计数据

  -p: 显示process相关统计数据

  -r: 显示io请求相关的统计数据

  -s: 显示swapped相关的统计数据

  --tcp

  --udp

  --unix

  --raw

  --socket

  --ipc

  --top-cpu:显示最占用CPU的进程

  --top-io: 显示最占用io的进程

  --top-mem: 显示最占用内存的进程

  --top-latency: 显示延迟最大的进程

iotop

iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO

iotop输出

第一行:Read和Write速率总计

第二行:实际的Read和Write速率

第三行:参数如下:

 线程ID(按p切换为进程ID)

 优先级

 用户

 磁盘读速率

 磁盘写速率

 swap交换百分比

 IO等待所占的百分比

 线程/进程命令

iotop常用参数

  -o, --only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效

  -b, --batch非交互模式,一般用来记录日志

  -n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用

  -d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1

  -p PID, --pid=PID指定监测的进程/线程

  -u USER, --user=USER指定监测某个用户产生的I/O

  -P, --processes仅显示进程,默认iotop显示所有线程

  -a, --accumulated显示累积的I/O,而不是带宽

  -k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用

iotop常用参数和快捷键

  -t, --time 加上时间戳,非交互非模式

  -q, --quiet 禁止头几行,非交互模式,有三种指定方式

   -q 只在第一次监测时显示列名

   -qq 永远不显示列名

   -qqq 永远不显示I/O汇总

交互按键

  left和right方向键:改变排序

  r:反向排序

  o:切换至选项--only

  p:切换至--processes选项

  a:切换至--accumulated选项

  q:退出

  i:改变线程的优先级

进程管理工具

kill命令:

向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写

显示当前系统可用信号: kill –l,trap -l

常用信号:man 7 signal

  1) SIGHUP: 无须关闭进程而让其重读配置文件

  2) SIGINT: 中止正在运行的进程;相当于Ctrl+c

  3) SIGQUIT:相当于ctrl+\\

  9) SIGKILL: 强制杀死正在运行的进程

  15) SIGTERM:终止正在运行的进程

  18) SIGCONT:继续运行

  19) SIGSTOP:后台休眠

指定信号的方法

(1) 信号的数字标识:1, 2, 9

(2) 信号完整名称:SIGHUP (3) 信号的简写名称:HUP

  按PID:kill [-SIGNAL] pid …

  kill –n SIGNAL pid;kill –s SIGNAL pid

  按名称:killall [-SIGNAL] comm…

  按模式:pkill [options] pattern

  -SIGNAL

  -u uid: effective user,生效者

  -U uid: real user,真正发起运行命令者

  -t terminal: 与指定终端相关的进程

  -l: 显示进程名(pgrep可用)

  -a: 显示完整格式的进程名(pgrep可用)

  -P pid: 显示指定进程的子进程

  pidof搜索指令进程号

作业管理

Linux的作业控制

前台作业:通过终端启动,且启动后一直占据终端;

后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

让作业运行于后台

(1) 运行中的作业: Ctrl+z

(2) 尚未启动的作业: COMMAND &

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系

nohup COMMAND &>/dev/null &

screen;COMMAND

查看当前终端所有作业:jobs

作业控制

fg [[%]JOB_NUM]:把指定的后台作业调回前台

bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行

kill [%JOB_NUM]: 终止指定的作业

把标准输出写入到nohub.out文件中

nohup ping 172.1 &

任务计划

Linux任务计划、周期性任务执行

未来的某时间点执行一次任务

 

at

包:at

at命令:at [option] TIME

常用选项:

-V 显示版本信息:

-l: 列出指定队列中等待运行的作业;相当于atq

-d: 删除指定的作业;相当于atrm

-c: 查看具体作业任务

-f /path/from/somefile:从指定的文件中读取任务

-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

TIME:定义出什么时候进行 at 这项任务的时间

HH:MM [YYYY-mm-dd]

noon, midnight, teatime(4pm)

tomorrow

now+#{minutes,hours,days, OR weeks}

执行方式:

 1)交互式 2)输入重定向 3)at –f 文件

依赖与atd服务,需要启动才能实现at任务

at队列存放在/var/spool/at目录中

/etc/at.{allow,deny}控制用户是否能执行at任务

白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令

黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行

  如果两个文件都不存在,只有 root 可以执行 at 命令

周期性任务计划cron

相关的程序包:

cronie: 主程序包,提供crond守护进程及相关辅助工具

cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务

crontabs:包含CentOS提供系统维护任务

计划任务

系统cron任务:/etc/crontab

注释行以 # 开头

详情参见 man 5 crontab

# 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

例如:晚上9点10分运行echo命令

10 21 * * * centos /bin/echo "Howdy!"

时间表示法:

(1) 特定值

  给定时间点有效取值范围内的值

(2) *

  给定时间点上有效取值范围内的所有值

表示“每...”

(3) 离散取值

  #,#,#

(4) 连续取值

  #-#

(5) 在指定时间范围上,定义步长

  /#: #即为步长

@reboot Run once after reboot

@yearly 0 0 1 1 *

@annually 0 0 1 1 *

@monthly 0 0 1 * *

@weekly 0 0 * * 0

@daily 0 0 * * *

@hourly 0 * * * *

anacron系统

运行计算机关机时cron不运行的任务,CentOS6以后版本取消anacron服务,由crond服务管理

对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统很重要对很有用

配置文件:/etc/anacrontab,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。

    •字段1:如果在这些日子里没有运行这些任务……

    •字段2:在重新引导后等待这么多分钟后运行它

    •字段3:任务识别器,在日志文件中标识

    •字段4:要执行的任务

  由/etc/cron.hourly/0anacron执行

  当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳

命令:

systemd-tmpfiles –clean|remove|create configfile

crontab命令定义

每个用户都有专用的cron任务文件: /var/spool/cron/USERNAME

crontab命令:

crontab [-u user] [-l | -r | -e] [-i]

-l: 列出所有任务

-e: 编辑任务

-r: 移除所有任务

-i:同-r一同使用,以交互式模式移除指定任务

-u user: 仅root可运行,指定用户管理cron任务

控制用户执行计划任务:

/etc/cron.{allow,deny}

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

LinuxDay17——SELinux

LInuxDay8——shell脚本编程基础

Linux14 进程管理之进程相关命令

第14章:Linux实操篇 进程管理

LinuxDay11——软件包管理

Linux:进程管理