Linux 进程管理

2024-01-10 13:01:20

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

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

一、常见进程管理软件

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

后台进程

nohup 和 & 在 Linux 中都用于将命令置于后台执行

使用场景

& 通常用于在后台执行不需要与父进程交互的命令,例如长时间运行的计算任务或守护进程

nohup 通常用于在后台执行需要与父进程交互的命令,例如需要读取用户输入或显示输出的命令

区别

1、输出

& 在后台执行命令时,会将命令的标准输出和标准错误重定向到 /dev/null

nohup 在后台执行命令时,不会将命令的标准输出和标准错误重定向到 /dev/null ,会显示打印

2、退出

& 在后台执行命令时,如果父进程退出,子进程也会收到信号并退出

nohup 在后台执行命令时,即使父进程退出,子进程也不会收到信号并退出

3、都是fork 子进程,但是

&?子进程继承了父进程的资源,包括环境变量、打开的文件句柄等,但子进程与父进程是相互独立的 (记忆可以类比软链接)

nohup?子进程与父进程是共用的 (记忆可以类比硬链接)

文章来源:https://blog.csdn.net/weixin_43839586/article/details/135395005
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。