Linux 进程管理

这一篇主要记录一些进程管理的命令,以及一小部分概念的笔记

线程是调度的基本单位,进程是资源拥有的基本单位

一、常见进程管理软件

jobs 查看后台工作状态

  • 进程运行中,按Ctrl+z 会导致进程停止并且进入后台等待
  • 通过&将进程丢到后台运行

jobs -l  可以查看当前的job

fg 将停止的工作提到前台继续运行

会话结束后,fg的任务也会中断

fg %1   将编号1的job到前台运行

bg 将停止的工作放到后台继续运行

会话结束后,bg的任务也会中断

bg %1  将1号job放到后台运行和&一样

kill

kill -l 查看可用的single

常用 single
    -0 检查进程是否正常运行,$? 0正常,大于0 就是不正常,会返回异常
    -1 SIGHUP:重新读取一次参数的配置文件 (类似 reload)
    -2 SIGINT:代表与由键盘输入 [ctrl]-c 同样的动作
    -9 SIGKILL:立刻强制删除一个工作
    -15 SIGTERM:以正常的进程方式终止一项工作

常用的方式:
kill -9 %1  通过kill 强行 关闭jobs
kill -15 %1 以正常的进程方式终止一项工作,告诉进程要结束了
kill -9 pid 强行结束进程(慎用!)

注意:结束工作请加%,避免强行关闭系统pid导致系统挂掉

pwdx 查看进程对应的工作目录

可以结合netstat 使用,用来查找进程的工作目录

netstat -anlp|grep 端口
pwdx pid

lsof 查看进程与文件的关联关系

lsof -p pid         # 查看指定进程用了哪些文件
lsof filepath       # 查看文件被哪些进程占用
lsof +d filepath    # 查看目录中被进程打开的文件
lsof -u username    # 查看某个用户的进程打开的文件
lsof -p pid -Pn     # 查看进程的socket
lsof |grep delete   # 查看被删除仍占用的文件和进程,这个全局的比较慢

fuser 通过文件或者文件系统找出正在使用该文件的进程

貌似没有lsof好用

fuser -mvu /proc  # 查看使用这个目录的进程和文件系统顶层情况
fuser -vu /proc   # 查看占用的进程的进程号和命令

pidstat 查看进程的状态

可以快速的找到读写高的进程,默认是显示CPU,非常好用、非常强大,简单截取了一部分

man pidstat
-C comm
    Display only tasks whose command name includes the string comm.  This string can be a regular expression.

-d     Report I/O statistics (kernels 2.6.20 and later only).  The following values may be displayed:
    UID    The real user identification number of the task being monitored.
    USER    The name of the real user owning the task being monitored.
    PID     The identification number of the task being monitored.
    kB_rd/s    Number of kilobytes the task has caused to be read from disk per second.
    kB_wr/s    Number of kilobytes the task has caused, or shall cause to be written to disk per second.
    kB_ccwr/s    Number  of  kilobytes  whose writing to disk has been cancelled by the task.This may occur when the task truncates some dirty pagecache. In this case, some IO which another task has been accounted for will not be happening.
    
-p pid
    
-r     Report page faults and memory utilization.

帮助文档用例:

# 每隔两秒显示系统中每个活动任务的CPU报告,统计5次
pidstat 2 5

# 每隔两秒钟显示PID 为 1643的页面故障和内存统计信息报告,统计5次
pidstat -r -p 1643 2 5

# 显示所有进程中包含"fox" 或 "bird"的进程的全局页面故障和内存统计信息
pidstat -C "fox|bird" -r -p ALL

# 每5秒打印一次进程IO情况,打印5次 
pid -d 5 5

全局页故障(global page faults)是指进程在访问内存时,所需的页面不在物理内存中,而是存储在磁盘上。当进程需要访问该页面时,操作系统会将该页面从磁盘加载到物理内存中,从而导致全局页故障。

nohub  在脱机或注销系统后,还能够让工作继续进行

注意: 如果是执行远程的nuhup 可能会出现预期外的结果,由于远程子shell结束而导致nohup进程结束

解决办法是 将需要放后台的命令结果重定向到/dev/null 进程会被system托管,例如:

 sudo nohup tcpdump -i ens3 -w ens3.pcap >/dev/null 2>&1  &

pstree

显示进程树,不常用

pstree -p pid

二、Linux进程

程序与进程

程序

存储在磁盘中,以可见文件状态存在

进程

程序执行后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中,操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运行中的程序

top

top 状态
    R (Running):该程序正在运作中;
    S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
    T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
    Z (Zombie):僵尸状态,进程已经终止但却无法被移除至内存外

僵尸进程,需要通过父进程来排查产生原因,从根本上解决问题,如果僵尸进程被systemd托管了,一般只能通过重启来清除了。

注意:cron 定时任务如果有大量的输出没有被重定向,会导致系统出现senb mail 的僵尸进程

命令行:
top -b -n 2 -d 1 > /tmp/top.txt    将top 1秒共计两次刷新结果写入文件

动态界面:
    h 查看帮助
    H 将进程切换到线程
    M 内存排序
    R 进程号排序
    i 展示非空闲进程
    e 切换动态内容内存的显示单位    
    E 切换前面4-5内存显示单位
    f 设置显示列表
    0 隐藏0项的数据
    1 查看CPU核数
    2/3 查看NUMA节点,再输入节点可以过滤对应节点的数据

程序优先级

Linux 给予进程一个所谓的 优先执行序 (priority, PRI),这个 PRI 值越低代表越优先的意思

不过这个 PRI 值是由核心动态调整的,用户无法直接调整 PRI值

PRI(new) = PRI(old) + nice

  • 当 nice 值为负值时,那么该进程就会降低 PRI 值,亦即会变的较优先被处理
  • nice 值可调整的范围为 -20 ~ 19 
  • root 可随意调整自己或他人进程的 Nice 值,且范围为 -20 ~ 19
  • 一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源)
  • 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5

配置nice的方式:

  • 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令
  • 调整某个已经存在的 PID 的 nice 值:用 renice 指令

进程资源限制(未完待续)

cgroups

namespace

相关推荐

  1. Linux 进程管理

    2024-01-07 10:06:03       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-07 10:06:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-07 10:06:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-07 10:06:03       82 阅读
  4. Python语言-面向对象

    2024-01-07 10:06:03       91 阅读

热门阅读

  1. K8S学习指南(62)-K8S源代码走读之Kube-Scheduler

    2024-01-07 10:06:03       71 阅读
  2. 纯虚函数和抽象类(C++)

    2024-01-07 10:06:03       62 阅读
  3. Binius:基于binary fields的SNARKs(Part 2)

    2024-01-07 10:06:03       72 阅读
  4. DOCKER镜像

    2024-01-07 10:06:03       59 阅读
  5. EF Core实体的五种不同的状态

    2024-01-07 10:06:03       81 阅读
  6. uniapp分包

    2024-01-07 10:06:03       54 阅读
  7. npm配置文件 .npmrc 加载优先级和使用示例

    2024-01-07 10:06:03       59 阅读
  8. Copilot在PyCharm的应用

    2024-01-07 10:06:03       80 阅读
  9. vue,小程序,uni-app的生命周期?

    2024-01-07 10:06:03       56 阅读