第10-1章:监控与管理作业系统上之程序(一)

前言

在上一章节中,介绍了档案与目录之使用者权限控管与管理,在这一章节中,将要介绍作业系统上的程序管理(process)。

Process之定义

一个Process程序包含相关的要素如下:

  • 给定一个分配好的记忆体当作空间位址供此运行的Process使用。
  • 安全设定机制包含了拥有者的认证与权限。
  • 一个或是多个程序码之执行绪在运行。
  • 有程序的状态(Process state)。

在作业系统环境上的Process包含之要素如下:

  • 本地与全域之变数。
  • 正在安排要执行的行文(context)。
  • 配置系统资源,像是档案描述符(指向档案的参照)与网路的埠号(Network ports)。

描述Process状态

整个作业系统启动并载入的时候会有一个main process,即主要的程序,叫做systemd,当其他的程序要启动的时候,systemd便会fork一个process出来运行指定的程序,当这个程序还没做完,再放到伫列中等待并休眠(sleeping),接着让下一个程序可以运行,并这样不断的循环下去,直到作业系统重新开启或关机为止,相关的示意图如下:

Process伫列管理

那Linux之程序状态有那些呢?相关的状态清单如下:

  • Running之Flag表示成:R,指的是Process程序的任务正在运行中,CPU正为了这个任务正在运作。
  • Sleeping之Flag为S的时候,指的是Process程序任务为中断的,这个程序正在等待某个条件,如硬体的请求、系统资源存取或是讯号,当上述的条件满足的时候,则Process状态又会切换成Running。
  • Sleeping之Flag为D的时候,指的是Process正在睡觉(sleeping),与S状态不同的是,这个状态不会回应任何的讯号,这个状态只会在这个当程序中断的时候,可能是成无法预期的装置状态所造成的。
  • Sleeping之Flag为K的时候,指的是这个程序任务已经被砍掉了,这是因为在D状态的时候收到signal讯号表示要砍掉因此变成这个状态。
  • Sleeping之Flag为I的时候,是D状态中的其中一种,与D状态的行为类似。
  • Stopped之Flag为T的时候,为T状态,这程序可以被除错,为debug状态,为暂时性的停止。
  • Zombie之Flag有Z与X两个状态,X状态是当程序结束的瞬间会变成此状态,这两个状态都无法作处理,只能等到机器重开机或是自己消失不见。

为什麽Process状态是很重要的?

因为在作业系统中,监控每个Process是可以观察出资源使用,还有哪个Process有问题,吃很多的资源等,而可以使用top这个指令来即时的监控目前作业系统上每个正在运作的Process之状态,相关的指令执行後输出的讯息如下:

[rockylinux@workstation ~]$ top
top - 00:53:36 up  3:28,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 176 total,   1 running, 175 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.6 us,  7.9 sy,  0.0 ni, 89.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1817.1 total,    660.8 free,    535.7 used,    620.6 buff/cache
MiB Swap:   2108.0 total,   2108.0 free,      0.0 used.   1124.7 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   4177 rockyli+  20   0   65428   4520   3880 R   5.6   0.2   0:00.03 top
      1 root      20   0  186872  14524   9556 S   0.0   0.8   0:03.55 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq
      9 root      20   0       0      0      0 S   0.0   0.0   0:00.03 ksoftirqd/0
     10 root      20   0       0      0      0 I   0.0   0.0   0:00.27 rcu_sched
     11 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/0
     12 root      rt   0       0      0      0 S   0.0   0.0   0:00.01 watchdog/0
     13 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     15 root      rt   0       0      0      0 S   0.0   0.0   0:00.01 watchdog/1
     16 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/1
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.11 ksoftirqd/1
     19 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-events_highpri
     21 root      20   0       0      0      0 I   0.0   0.0   0:00.13 kworker/u4:1-events_unbound
     22 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kdevtmpfs
     23 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns
     24 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kauditd
......

或者是可以使用ps aux指令来看到此作业系统上之process程序的瞬间状态,相关的执行指令输出的讯息如下:

[rockylinux@workstation ~]$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 186872 14524 ?        Ss   Sep27   0:03 /usr/lib/systemd/systemd --switched-root
root           2  0.0  0.0      0     0 ?        S    Sep27   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   Sep27   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   Sep27   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   Sep27   0:00 [kworker/0:0H-events_highpri]
root           8  0.0  0.0      0     0 ?        I<   Sep27   0:00 [mm_percpu_wq]
root           9  0.0  0.0      0     0 ?        S    Sep27   0:00 [ksoftirqd/0]
root          10  0.0  0.0      0     0 ?        I    Sep27   0:00 [rcu_sched]
root          11  0.0  0.0      0     0 ?        S    Sep27   0:00 [migration/0]
root          12  0.0  0.0      0     0 ?        S    Sep27   0:00 [watchdog/0]
......

ps指令未带参数执行的话,则会将目前Shell所有底下正在执行的程序都印出,有时候,Prcoess名称会太长,导致终端机输出的讯息不完整,且被截断,为了要避免这件事情,可以加上w参数让被截断的讯息可以自动换行并印出。

工作与工作阶段介绍

正在运行的工作就被称为:Process程序,而程序可以分成在前景与背景执行,在前景执行就是在终端机上面执行一个指令,等到这个指令运作完成与结束之後,才可以继续执行其他的指令,而背景就不一样了,当Process放到背景中去执行的时候,则终端机可以继续执行下一个指令,不需要等待。

相关的指令演示与输出的讯息如下:

[rockylinux@workstation ~]$ sleep 100

当执行上述的指令的时候,需要等待sleep指令完成,即等待100秒之後,终端机才会回复并执行下一个指令,若是改成在背景执行,则可以在指令的後面加上&即可,相关的指令执行输出讯息如下:

[rockylinux@workstation ~]$ sleep 100 &
[1] 4459
[rockylinux@workstation ~]$ jobs
[1]+  Running                 sleep 100 &
[rockylinux@workstation ~]$

当在背景执行的时候,会输出一个Process id,利用jobs指令则可以看到目前在这个终端机上运行在背景的Process有哪一些,若要将背景的工作较回到前景也是可以的,利用fg指令便可以达到,假设要将上述放在背景中运行的sleep 100叫回到前景,可以看到这个背景Process运行的编号是1,即[1]+,则执行fg %1即可,相关的指令执行输出的讯息如下:

[rockylinux@workstation ~]$ fg %1
sleep 100

当背景工作结束的时候,有时按下enter键,则会跳出下列的讯息,则表示编号为1的背景工作已经结束了,相关的指令执行输出的讯息如下:

[rockylinux@workstation ~]$
[1]+  Done                    sleep 100

若要将被叫回前景的Process再次回到背景,则可以使用bg这个指令,操作的流程如下:

  • 先执行sleep 100 &指令。
  • 假设上述供作编号为1,则执行fg %1
  • 接着使用「ctrl」+「Z」键将当前的前景工作停止。
  • 使用jobs -l观看目前在背景工作的清单与状态。
  • 接着执行bg %1
  • 再使用jobs -l观看目前在背景工作的清单与状态。
[rockylinux@workstation ~]$ jobs -l
[rockylinux@workstation ~]$ sleep 100
^Z
[1]+  Stopped                 sleep 100
[rockylinux@workstation ~]$ jobs -l
[1]+  5805 Stopped                 sleep 100
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ bg %1
[1]+ sleep 100 &
[rockylinux@workstation ~]$ jobs -l
[1]+  5805 Running                 sleep 100 &
[rockylinux@workstation ~]$

课後练习

  • 请开启workstation虚拟机器,并使用rockylinux之使用者登入桌面环境,并开启终端机。
  • 执行sleep 90在前景,接着试着让其中断。
  • 试着找到上述中断的工作并试着切换成运行的状态。

<<:  IT 铁人赛 k8s 入门30天 -- day13 Deploying Stateful Apps with StatefulSet

>>:  Day12 主动情蒐-确认目标 metasploitable 3 的 IP

Day35 - Windows 提权(6)-提权手法统整 Kernel Exploits vs Services Exploits

以图卡的方式统整一下 Windows 提权手法: Kernel Exploits vs Servic...

【Day 11】Python os.path模组

OS模组(Python内建) 说明 : os模组是一种与作业系统相关的模组,提供数十种与作业系统沟通...

Day2 安装<Cocoapods>,以及第三方套件<RealmSwift>

首先打开终端机输入此行 接下来系统会要求输入你电脑的密码 输入完之後按enter,之後就会自己跑,跑...

Day 3:让我看看你状态正不正常啊 - 架设 status page

昨天提到了有关监控的议题,监控服务的其中一个目的是为了在系统发生错误的时候可以即时的通知相关人员,...

更详细的 Docker 操作方法

到目前为止,介绍了许多操作 Docker 的方法,现在来了解更详细的操作方法。 说穿了,其实还是下指...