Linux 进程管理和工作管理


进程管理

什么是进程

进程和程序

  • 程序(program):通常为二进制文件,放置在存储媒体中,为实体文件;
  • 进程:进程是执行的程序。程序被执行后,执行者的权限和属性、程序代码与所需数据等都会被加载到内存中,操作系统赋予这个内存内的单元一个标识符PID。

程序一般放置在实体磁盘中,通过用户的执行来触发,触发后被加载到内存运行成为进程。操作系统为了管理该进程,赋予进程执行者的权限和属性等参数,以及程序需要的数据等,最后赋予一个PID。操作系统就是通过PID判断进程是否有权限进行工作。

子进程和父进程

操作系统允许一个进程创建另一个进程,而且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源应当还给父进程。同时,终止父进程的同时也会终止其所有的子进程。

注意:Linux操作系统对于终止有子进程的父进程,会将子进程交给1号进程接管。

在Linux系统中,进程会根据父进程fork一个一模一样的子进程,被fork出来的子进程再以exec方式执行实际要进行的程序。

例如:在当前的bash环境下再执行一次bash

[root@localhost Desktop]# ps -l    # 此时的bash的PID为2145
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   2145   2141  0  80   0 - 29037 wait   pts/0    00:00:00 bash
0 R     0   2797   2145  0  80   0 - 34857 -      pts/0    00:00:00 ps
[root@localhost Desktop]# bash 
[root@localhost Desktop]# ps -l    # 此时出现第二个bash,其PID为2801,PPID为第一个bash的PID
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   2145   2141  0  80   0 - 29037 wait   pts/0    00:00:00 bash
4 S     0   2801   2145  1  80   0 - 29039 wait   pts/0    00:00:00 bash
0 R     0   2835   2801  0  80   0 - 34857 -      pts/0    00:00:00 ps

进程的查看

静态查看 ps

监测进程,ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的很多信息。默认情况下,ps命令不会提供很多信息,只会显示运行在当前控制台下的属于当前用户的进程:

[root@localhost Desktop]# ps
   PID TTY          TIME CMD
  2110 pts/0    00:00:00 bash
  6074 pts/0    00:00:00 ps
 进程PID 终端  进程已用CPU时间  命令
ps -ef

ps -ef查看系统中所有的进程,显示进程的UID、PID、PPID、CPU利用率和实际CPU使用时间、启动时间、终端 。

ps -ef
选项:
-e:显示运行在系统上的所有进程
-f:显示完整格式的输出

[root@localhost Desktop]# ps -ef 
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:56 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0 13:56 ?        00:00:00 [kthreadd]
root          3      2  0 13:56 ?        00:00:00 [ksoftirqd/0]
root          7      2  0 13:56 ?        00:00:00 [migration/0]
root          8      2  0 13:56 ?        00:00:00 [rcu_bh]
  • UID:启动进程的用户
  • PID:进程ID
  • PPID:父进程的进程号
  • C:进程生命周期中CPU利用率
  • STIME:进程启动时的系统时间
  • TTY:进程启动时的终端设备
  • TIME:运行进程需要的累计CPU时间
  • CMD:启动的程序名称
ps -l

ps -l :仅查看自己bash相关进程,较之ps -ef,ps -l还显示进程的状态、优先级、内存相关信息。

ps -l
选项:
-l:显示长格式输出

[root@localhost Desktop]# ps -l  
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   2110   2106  0  80   0 - 29037 wait   pts/0    00:00:00 bash
0 R     0   6513   2110  0  80   0 - 34857 -      pts/0    00:00:00 ps
0 S     0   6514   2110  0  80   0 - 27531 pipe_w pts/0    00:00:00 more
  • F:内核分配给进程的系统标记
  • S:进程的状态(R正在运行、S可唤醒的睡眠状态、D不可唤醒的睡眠状态、Z僵尸装填、T停止状态)
  • UID:启动进程的用户
  • PID:进程ID
  • PPID:父进程的进程ID
  • C:进程生命周期中CPU的利用率
  • PRI:进程优先级(数字越大优先级越低)
  • NI:谦让度值用来参与决定优先级
  • ADDR:进程的内存地址
  • SZ:假如进程被换出,所需交换空间的大小
  • WCHAN:进程休眠的内核函数地址
  • TTY:启动进程时的终端
  • TIME:进程实际使用CPU的时间
  • CMD:运行的程序名
ps aux

ps aux:查看系统所有进程,显示进程用户信息、进程标识符、CPU和内存的利用百分比、虚拟内存和物理内存所占大小、进程的状态等信息。

ps aux
选项:
a:显示跟任意终端关联的所有进程
u:采用基于用户的格式显示
x:显示所有进程,包括未分配终端的进程

[root@localhost Desktop]# ps aux | more 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 123412  3944 ?        Ss   13:56   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    13:56   0:00 [kthreadd]
  • USER:启动进程的用户
  • PID:进程ID
  • %CPU:进程使用掉的CPU百分比
  • %MEM:进程所占用的物理内存百分比
  • VSZ:进程占用的虚拟内存大小(KB)
  • RSS:进程占用的实际内存大小(KB)
  • TTY:启动进程的终端(若与终端无关则显示?)
  • STAT:进程的状态
  • START:进程启动的时间
  • TIME:进程实际使用CPU的时间
  • COMMAND:运行的程序名

动态查看 top

ps命令虽然在收集运行在系统上的进程信息时很有用,但是它也有不足之处:只能显示某个特定时间点的信息。如果想观察那些频繁换进换出的内存的进曾趋势,可以使用实施侦测进程运作的top命令。

top [-d number] | top [-bnp]
选项:
-d:后接秒数,表示页面更新秒数,预设五秒
-b:以批次的方式执行 top ,通常会搭配数据流重导向来将批次的结果输出成为文件
-n:与 -b 搭配,需要进行几次 top 的输出结果
-p:指定PID进行监测

在 top 执行过程当中可以使用的按键指令:
   ? :显示在 top 当中可以输入的按键指令;
   P :以 CPU 的使用率排序显示;
   M :以 Memory 的使用率排序显示;
   N :以 PID 来排序;
   T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序; 
   k :给予某个 PID 一个讯号 (signal) ;
   r :给予某个 PID 重新制订一个 nice 值;
   q :离开 top 软件。

top - 15:33:19 up  1:37,  2 users,  load average: 0.37, 0.12, 0.08
Tasks: 413 total,   2 running, 411 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.3 us,  1.0 sy,  0.0 ni, 96.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2033524 total,   798160 free,   566120 used,   669244 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.  1234040 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                
  1832 root      20   0 1495832 208204  44772 S  1.3 10.2   1:03.22 gnome-shell                                                            
   294 root      20   0       0      0      0 S  0.3  0.0   0:00.16 kworker/u256:1                                                         
   533 root      20   0       0      0      0 S  0.3  0.0   0:00.62 xfsaild/sda3                                                           
   771 root      20   0  320116   6328   4884 S  0.3  0.3   0:05.64 vmtoolsd                                                               
   816 polkitd   20   0  528452  14144   4936 S  0.3  0.7   0:00.97 polkitd                   

第一行显示系统的概括:当前时间、系统的运行时间、登录的用户数、系统的平均负载

  • 平均负载有三个值:最近1分钟、最近5分钟、最近15分钟的平均负载。值越大说明负载越高。

第二行显示进程概要信息:top命令的输出将进程称为任务(task):进程总数、有多少进程处于运行、休眠、停止、僵尸状态

第三行显示了CPU概要信息:用户空间占用CPU百分比、内核空间占用CPU百分比、用户进程空间改变过优先级的进程占用CPU百分比、空闲CPU百分比、等待输入输出的CPU时间百分比、硬中断占用CPU百分比、软中断占用CPU百分比

第四行显示了内存概要信息:物理内存总量、使用的物理内存总量、空闲物理内存总量、用作内核缓存的内核量

第五行显示了swap概要信息:交换分区总量、使用的交换分区总量、空闲的交换分区总量、缓冲的交换分区总量、可用于进程下一次分配的物理内存量

第六行显示了运行中的进程的详细列表

  • PID:进程ID
  • USER:进程属主
  • PR:进程优先级
  • NI:进程谦让度
  • VIRT:进程占用的虚拟内存总量
  • RES:进程占用的物理内存总量
  • SHR:进程和其他进程共享的内存总量
  • S:进程状态
  • %CPU:进程使用的CPU时间百分比
  • %MEM:进程使用的内存占可用内存的比例
  • TIME+:自进程启动到目前为止的CPU时间总量
  • COMMAND:启动的程序名

进程树查看 pstree

查看进程之间的相关性,直接输入pstree命令即可查到。由pstree的输出看出,所有的进程都是依附于systemd进程下(Linux核心呼叫的第一个程序)。

[root@localhost Desktop]# pstree -p
systemd(1)─┬─ModemManager(788)─┬─{ModemManager}(810)
           │                   └─{ModemManager}(812)
           ├─NetworkManager(791)─┬─dhclient(2258)
           │                     ├─{NetworkManager}(829)
           │                     └─{NetworkManager}(833)
           ├─abrt-watch-log(776)
           ├─abrt-watch-log(777)
           ├─abrtd(775)
           ├─accounts-daemon(759)─┬─{accounts-daemon}(763)
           │                      └─{accounts-daemon}(770)
           ├─alsactl(793)
           ├─at-spi-bus-laun(1779)─┬─dbus-daemon(1783)
           │                       ├─{at-spi-bus-laun}(1780)
           │                       ├─{at-spi-bus-laun}(1782)
           │                       └─{at-spi-bus-laun}(1784)
           ├─at-spi2-registr(1787)───{at-spi2-registr}(1790)
           ├─atd(1066)
......

进程的管理

可以通过给予进程要给signal告诉进程想要它做什么,可以使用kill -l或man 7 signal查询所有signal。
signal

  • kill:kill -signal PID
  • killall:killall -signal command name

由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree 等命令。要删除某个进程,可以使用 PID 或者是启动该进程的指令名称, 而如果要删除某个服务,最简单的方法就是利用 killall , 因为该命令可以将系统当中所有以某个指令名称启动的进程全部删除。

工作管理

什么是工作管理

工作管理(job control)是用在bash环境下,在登入系统取得bash shell之后,于单一终端机接口下同时进行多个工作的行为管理。

在进行工作管理时,每个工作都是目前bash的子进程,即彼此之间具有相关性,无法由tty1环境去对tty2进行工作管理。

工作管理注意:

  • 管理的工作所触发的进程必须来自于自己的shell的子进程;
  • 前台:可以控制与下达命令的环境称之为前台(foreground);
  • 后台:可以自行运作的工作,无法使用ctrl+c 终止,可以使用bg/fg呼叫该工作;
  • 后台执行的进程不能等待输入。

工作管理相关命令

将命令丢到后台执行 &

[root@localhost Desktop]# tar -czf /tmp/etc.tar.gz /etc/ &
[1] 3130    # [job number] PID
tar: Removing leading `/' from member names

如上所示,将压缩命令使用&放置后台执行,bash会给予该命令一个工作号码(job number)。

[1]+  Done                    tar -czf /tmp/etc.tar.gz /etc/

当工作完成(Done)后,会在bash中蹦出来以上提示。在工作执行过程有输出信息stdout或错误信息stderr时,会显示在前台,并且无法使用Ctrl+C停止,这会影响前台的工作。因此可以使用数据流重定向,将输出文件传送至某个文件中。

将工作丢到后台中暂停 ctrl+z

[root@localhost Desktop]# vim /etc/fstab

[1]+  Stopped                 vim /etc/fstab

如在编辑/etc/fstab文件中,想要查找一个文件的UUID,可以在vim的命令模式在按下ctrl+z组合键,这样就可以将vim工作放置后台并暂停,取得前台的操控权。

  • [1]:表示这是第一个工作
  • +:表示最近一个被丢进后台的工作,以及在后台预设会被取用的那个工作(fg相关)
  • Stopped:表示该工作状态为暂停状态

查看后台的工作状态 jobs

jobs [-lrs]
选项:
-l:列出job number和PID
-r:仅列出正在后台run的工作
-s:仅列出在后台中stop的工作

[root@localhost Desktop]# jobs -l
[1]-  2199 Stopped                 vim /etc/fstab
[2]+  2394 Stopped                 find / -print

注意job number后的±号:

  • +:表示后台预设的取用工作以及最近一个被丢进后台的工作,当输入fg时,拥有+号的工作会被拿到前台
  • -:表示最近最后第二个被放到后台的工作
  • 其他的工作没有±号的存在

将后台工作拿到前台处理 fg

fg %jobnumber
选项:
%jobnumber:jobnumber为工作号码,%可有可无

[root@localhost Desktop]# jobs -l
[1]-  2199 Stopped                 vim /etc/fstab
[2]+  2394 Stopped                 find / -print

[root@localhost Desktop]# fg    # 默认拥有加号的工作拿到前台处理,即[2]号工作

[root@localhost Desktop]# fg %1    # 指定将[1]号工作拿到前台处理

让工作在后台的状态变成运行中 bg

bg %jobnumber
选项:
%jobnumber:jobnumber为工作号码,%可有可无

@localhost Desktop]# jobs -l    # 查看当前后台的工作
[1]-  2199 Stopped                 vim /etc/fstab
[2]+  2935 Stopped                 find / -perm /7000 > /tmp/text.txt
[root@localhost Desktop]# bg %2    # 将2号工作在后台变为运行中的状态
[2]+ find / -perm /7000 > /tmp/text.txt &
[root@localhost Desktop]# jobs -l    # 再次查看后台工作,发现2号工作状态已经改变
[1]+  2199 Stopped                 vim /etc/fstab
[2]-  2935 Running                 find / -perm /7000 > /tmp/text.txt &

管理后台工作 kill

kill -signal %jobnumber
选项:
-l:查看kill能够使用的signal
-9:强制删除
-15:正常终止工作

注意:kill后接的数字默认为PID,如果用于bash的工作管理,需要加上%数字。

[root@localhost Desktop]# 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	
[root@localhost Desktop]# jobs -l
[1]+  2199 Stopped                 vim /etc/fstab
[root@localhost Desktop]# kill -9 %1    # 杀死后台的1号工作
[1]+  Killed                  vim /etc/fstab
[root@localhost Desktop]# jobs -l
[root@localhost Desktop]# 

脱机进行工作 nohup

以上工作管理的后台为bash的后台,而不是系统的后台。因此在工作运行尚未结束的情况下一旦脱机,工作就会被中断。

解决方式:

  • at命令,at命令将工作放置于系统后台,与终端机无关;
  • nohup命令,nohup可以在脱机或注销系统后,使得工作继续运行。

nohup [指令与参数] —— 在终端机前台工作
nohup [指令与参数] & —— 在终端机后台工作

注意:nohup不支持bash内部命令,只能使用外部命令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux进程管理进程通信是操作系统非常重要的概念。我可以为您提供一些关于这两个主题的基本信息。 1. 进程管理: 在Linux进程是指在执行的程序实例。进程管理包括创建、调度、终止和监控进程的活动。以下是一些关于进程管理的关键概念: - 进程标识符(PID):每个进程都有一个唯一的PID,用于标识和跟踪进程。 - 进程状态:进程可以处于运行、就绪、阻塞或终止等不同状态。 - 进程调度:操作系统根据特定算法决定哪个进程应该在给定时间内运行。 - 进程创建:通过fork()系统调用创建子进程,或者通过exec()系列系统调用加载新程序镜像并替换当前进程。 - 进程终止:进程可以自愿终止,或者由其他进程(如父进程或操作系统)强制终止。 - 进程监控:可以使用系统工具(如ps、top)或编程接口(如proc文件系统)来监控和管理进程。 2. 进程通信: 进程通信是指进程之间交换数据和信息的机制。在Linux,有多种方法可以进行进程间通信,包括: - 管道(Pipe):用于在父子进程或具有亲缘关系的进程之间进行通信。 - 信号(Signal):用于向进程发送简单的通知或断信号。 - 共享内存(Shared Memory):允许多个进程共享同一块物理内存,以便快速高效地进行数据交换。 - 消息队列(Message Queue):进程可以通过消息队列传递和接收消息。 - 信号量(Semaphore):用于实现进程间的互斥和同步操作。 - 套接字(Socket):适用于网络编程,允许不同主机上的进程进行通信。 这只是对Linux进程管理进程通信的简要介绍,如果您有任何具体问题或深入了解的需求,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值