程序管理(PRI与NI、bash的工作管理、job control的管理、程序的管理)

学习目标:

Linux速成六、


学习内容:

1、程式与程序
2、观察程序的指令
3、程序的优先序 PRI 于 NI
4、bash 的工作管理
5、特殊权限 SUID/SGID/SBIT 的功能
6、job control 的管理
7、离线管理的问题
8、程序的管理


1、程式与程序

  • 程式 (program):通常为 binary program ,放置在存储介质中 (如硬盘、光碟、磁帶等),为实体档案的型态存在;一个程式可以生成多个程序。
  • 程序(process):程式被触发后,执行者的权限与属性、程式的程式码与所需资料等都会被载入内存中,作业系统并给予这个内存的单元一个识别码(PID),可以说,程序就是一个正在运作中的程式。
  • 不同的使用者登入都是执行 /bin/bash 这个 shell,读者也应该知道系统管理需要管理员身份的 bash 才能够运作,一般账号的bash 能做的事情相对较少,但其实两者都是执行 bash 的
    在这里插入图片描述
  • 父程序与子程序 su 来切换身份成为 root,此时 su 会给予一个具有 root 权限的 bash 环境,那么使用者登入的 bash就被称为父程序,由 su - 取得后的 bash 就是子程序
    在这里插入图片描述

2、观察程序的指令

  • ps观察程序
  • 选项与参数:

-A :所有的 process 均显示出來,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
-x :通常与 a 这个参数一起使用,可列出较完整信息。 输出格式规则:

  • -l :较长、较详细的将该 PID 的的信息列出
  • -j :工作的格式 (jobs format)
  • -f :做一个更为完整的输出
[root@192 ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 179100 13492 ?        Ss   1027   0:03 /usr/lib/systemd/systemd --switched-root --system --d
root           2  0.0  0.0      0     0 ?        S    1027   0:00 [kthreadd]
...
[root@192 ~]# ps -lA
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 44775 do_epo ?        00:00:03 systemd
1 S     0       2       0  0  80   0 -     0 -      ?        00:00:00 kthreadd
...
[root@192 ~]# ps axjf
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       2       0       0 ?             -1 S        0   0:00 [kthreadd]
...
[root@192 ~]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3325    3324  0  80   0 - 59082 -      pts/0    00:00:00 bash
0 R     0    3358    3325  0  80   0 - 63798 -      pts/0    00:00:00 ps
  • F (flag):代表程序的总结旗标,常见为4 代表 root
  • S (stat):状态列,主要的分类项目有:
    R (Running):该程式正在运作中;
    S (Sleep):该程式目前正在睡眠状态(idle),但可以被唤醒(signal)。
    D :不可被唤醒的睡眠状态,通常这支程式可能在等待 I/O 的情況(ex>列印)
    T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
    Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
  • UID/PID/PPID:代表此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码
  • C:代表 CPU 使用率,单位为百分比;
  • PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该程序越快被 CPU 执行。
  • ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示- / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运作中,同样的, 若为-表示正在运作中。
  • TTY:登入者的终端机位置,若为远端登入则使用动态终端介面 (pts/n);
  • TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运作的时间,而不是系统时间;
  • CMD:就是 command 的缩写,造成此程序的触发程式之指令为何

2、使用 pstree 与 ps aux 观察全系统的程序

  • pstree命令的安装
    1、在 Mac OS上
    brew install pstree
    2、在 Fedora/Red Hat/CentOS
    yum -y install psmisc
    3、在 Ubuntu/Debian
    apt-get install psmisc

  • 直接显示出程序关系树 -A

在这里插入图片描述

  • 若需要加上 PID 与使用者资料,可以直接使用 -up 来加入即可
    在这里插入图片描述

3、 ps aux查看程序看见的信息也更丰富

在这里插入图片描述

  • USER:该 process 属于那个使用者账号的
  • PID :该 process 的程序识别码
  • %CPU:该 process 使用掉的CPU 资源百分比
  • %MEM:该 process 所占用的实体内存百分比
  • VSZ :该 process 使用掉的虚拟内存
  • (Kbytes) RSS :该 process 占用的固定的内存 (Kbytes)
  • TTY :该 process是在那个终端机上面运作,若与终端机无关则显示,另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连接主机的程序
  • STAT:该程序目前的状态,状态显示与ps -l 的 S 旗标相同 (R/S/T/Z)
  • START:该 process 被触发启动的时间
  • TIME :该 process 实际使用 CPU 运作的时间
  • COMMAND:该程序的实际指令为何

4、top动态观察程序

  • id 越高代表系统越闲置,wa 越高代表程序卡在硬盘或者网络上,此时系统性能比较差
  • 选项与参数:

-d :后面可以接秒数,就是整个程序更新更新的秒数。默认是 5 秒
-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 软件的按键
[root@192 ~]# top -d 2
top - 05:03:27 up  8:13,  1 user,  load average: 0.00, 0.00,
Tasks: 135 total,   1 running, 134 sleeping,   0 stopped,   
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 h
MiB Mem :   1800.6 total,   1086.7 free,    252.8 used,    4
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   13
...

在这里插入图片描述

[root@192 ~]# ls -l
总用量 12
-rw-r--r--. 1 root root   22 1028 04:30-rw-------. 1 root root 1180 1023 22:57 anaconda-ks.cfg
-rw-r--r--. 1 root root    0 1028 02:30 file1
-rwxr-xr-x. 1 root root   22 1028 04:30 sleep500.sh
drwxr-xr-x. 3 root root   41 1028 03:31 yyt1
[root@192 ~]# top -b -n 2 > ~/file1 
[root@192 ~]# cat file1 
top - 05:09:32 up  8:19,  1 user,  load average: 0.00, 0.00, 
Tasks: 137 total,   2 running, 135 sleeping,   0 stopped,   0
%Cpu(s):  0.0 us,  3.1 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi
MiB Mem :   1800.6 total,   1086.7 free,    252.8 used,    46
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   135

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM
      1 root      20   0  179100  13492   8532 S   0.0   0.7
      2 root      20   0       0      0      0 S   0.0   0.0
      3 root       0 -20       0      0      0 I   0.0   0.0...
...
- bash PID 可由 $$ 变数取得,请使用 top 持续观察该 PID
[root@study ~]# echo $$
3325
[root@study ~]# top -d 2 -p 3325
top - 05:15:28 up  8:25,  1 user,  load average: 0.00, 0.00, 0
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.2 hi,
MiB Mem :   1800.6 total,   1086.6 free,    252.8 used,    461
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   135

在这里插入图片描述

top 程式执行的状态列,每个项目目的意义为:

  • PID :每个 process 的识别码 (PID)
  • USER:该process 所属的使用者;
  • PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;
  • NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
  • %CPU:CPU 的使用率;
  • %MEM:内存的使用率;
  • TIME+:CPU 使用时间的累加;
  • COMMAND:指令

3、 程序的优先序 PRI 于 NI

  • 系統运作时,内存內的程序量非常的大,但每个程序的重要性都不一样。为了让系统比较快速的执行重要的程序,因此设计上增加Priority(PRI) 这个优先序的设定。基本上,PRI 越低代表系统会执行较多次该程序,也就是该程序会比较早被执行完毕(因为同一周期会被执行较多次)
    在这里插入图片描述

  • Linux 提供一个名为 Nice (NI) 的数值来让使用者影响程序的 PRI:

PRI(new) = PRI(old) + NI

  • NI 的使用是有限制的,基本限制如下:

nice 值可调整的范围为 -20 ~ 19 ;
root 可随意调整自己或他人程序的 Nice 值,且范围为-20~19;
一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源)
要影响 NI 主要透过 nice 与 renice 来处理,也能够透过top 來处理已经存在的程序的 NI。
一开始执行程式就立即给予一个特定的 nice 值:用 nice 指令;
调整某个已经存在的 PID 的 nice 值:用 renice 指令或 top 指令


4、bash 的工作管理

  • 工作管理 (job control) 是用在 bash 环境下的,也就是说:当用户登入系统取得 bash shell之后,在单一终端机介面下同时进行多个工作的行为管理 用户在登入 bash后,可以一边复制档案、一边进行搜索资料、一边进行编译,还可以一边进行 vim 程式撰写之意
  • 在工作管理时应该注意:

这些工作所触发的程序必须是来自于自己的子程序(只管理自己的程序)
.前台:你可以控制与下达指令的这个环境称为前景的工作
. 后台:可以自行运行的工作,自己无法使用ctrl+c终止他,可使用bg/fg呼叫该工作
.背景中:执行的程序不能等terminal/shell的输入(input)

  • 常见的工作管理使用的符号与组合:

. &:将指令丟到后台中执行 & eg:cp file1 file2 & 复制file1并改名为file2 在后台运行
. command&:直接将command丢到背景中执行,若有输出,最好使用资料流重导向输出到其他档案
.ctrl+z:将目.录正在前景中的工作丢到背景中暂停
.jobs[-l]:列出目前的工作信息
. fg%n:将第n个在背景当中的工作移到前景来操作
. bg%n:将第n个在背景中的工作变成执行中


5、特殊权限 SUID/SGID/SBIT 的功能

  • SUID 的基本功能为:

.SUID 权限仅对二进制程式(binary program)有效;
. 执行者对于该程式需要具有 x 的可执行权限
.本权限仅在执行该程式的过程中有效(run-time)
. 执行者将具有该程式拥有者 (owner) 的权限

  • 对于文档SGID 的功能為为:

.SGID 对二进制程式有用
.程式执行者对于该程式来说,需具备 x 的权限
. 执行者在执行的过程中将会获得该程式群组的支援

  • 对于目录来说SGID ,当一个目录设定了 SGID 之后,会具有如下的功能:

. 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
. 使用者在此目录下的有效群组(effective group)将会变成该目录的群组
. 用途:若使用者在此目录下具有 w的权限(可以新建文档),则使用者所建立的新文档,该新文档的群组于此目录的群组相同

  • SBIT 的功能与观察

.当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时
.当使用者在该目录下建立文档或目录时,仅有自己与root 才有权力刪除该文档

  • SUID/SGID/SBIT 权限的设定,权限分数的计算方式为:
    4为 SUID
    2 为 SGID
    1 为 SBIT

在这里插入图片描述

  • 除数字法赋值之外,符号法的使用上,可以使用类似底下的方式分別给予SUID/SGID/SBIT:

     SUID: chmod u+s filename
     SGID: chmod g+s filename
     SBIT: chmod o+t filename
    
  • eg:/tmp 的传统全此案为drwxrwxrwx (777) 外加一个SBIT,因此分数为1777
  • /usr/bin/locate 传统权限为-rwx–x--x (711) 外加一个 SGID,因此分数会成为2711
  • /usr/bin/passwd 的传统权限是-rwxr-xr-x (755),外加一个 SUID,因此分数成为4755

6、job control 的管理

  • 1、&:把程序放到后台中去运行

eg:cp /file1 yyt1/file2 &

[root@192 yyt1]# cd ..
[root@192 ~]# cp ~/file1 yyt1/file2 &
[1] 2727
[root@192 ~]# jobs
[1]+  已完成               cp -i ~/file1 yyt1/file2
[root@192 ~]# cd yyt1
[root@192 yyt1]# ls -l
总用量 4
-rw-r--r--. 1 root root  0 1028 03:31 file2
-rw-r--r--. 1 root root 54 1027 22:04 wy

2、将运行中的程序放到后台中去暂停

  • [ctrl]-z:当程序运行时,摁下[ctrl]-z程序就会停止并存入后台方便后面拿出来运行
[root@192 ~]# find / -print
/sys/fs/selinux/booleans/virt_sandbox_use_sys_admin
/sys/fs/selinux/booleans/virt_sandbox_use_netlink
/sys/fs/selinux/booleans/virt_sandbox_use_audit
...
ry.failcnt
/sys/fs/cgroup/memory/system.sl^Z
[1]+  已停止               find / -print

3、观察后台程序的状态

  • jobs:可以看到后台的程序及他们的状态
  • 参数

-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在后台中暂停(stop) 的工作。 `

[root@192 ~]# jobs -l
[1]+  已停止               find / -print
[root@192 ~]# jobs -s
[1]+  已停止               find / -print
[root@192 ~]# jobs -r
[root@192 ~]# 

后台只有一个刚才停止的程序,所以jobs -l和jobs -s显示的是一样的,而没有正在运行的程序,所以jobs -r没有反应


4、将后台的程序拿到前台来运行完成

  • fg:可以把后台的程序调出来运行
[root@192 ~]# jobs -l
[1]+  2740 Stopped                 find / -print
[root@192 ~]# fg %1
...
.service-pxZAvm/tmp
/tmp/text.txt
/home
[1]+  已完成               find / -print
[root@192 ~]# jobs -l
[root@192 ~]# 

5、让后台的程序变成运行中

  • bg:把后台暂停的程序变成运行中完成
[root@192 ~]# jobs 
[1]+  已停止               find / *.log
[root@192 ~]# bg %1
...
/tmp/text.txt
/home
find:*.log’: No such file or directory

[1]+  退出 1                find / *.log

6、终止后台的程序
killall:

-i :interactive 的意思,互动式的,若需要刪除时,会出现提示字元给使用者
-e :exact的意思,表示后面接的 command name 要一致,但整个完整的指令不能超过 15 个字元
-I :指令名称(可能含参数)忽略大小写

  • kill:将后台的程序杀死掉
  • kill 后面接的数字预设会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字 了
  • 参数:

-l :这个是 L 的小写,列出目前 kill 能够使用的信号 (signal) 有哪些
signal :代表给予后面接的那个工作什么样的指示,用 man 7 signal 知:

  • -1 :重新读取一次参数的设定档 (类似 reload)
  • -2 :代表与由键盘输入 [ctrl]-c 同样的动作
  • -9 :立刻强制删除一个工作
  • -15:以正常的程序方式终止一项工作。与 -9 是不一样的
[root@192 ~]# kill -l
1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL   5) SIGTRAP
6) SIGABRT  7) SIGBUS  8) SIGFPE  9) SIGKILL 10) SIGUSR1
...
[root@192 ~]# jobs -l
[1]+  2800 Stopped                 find / -print
[root@192 ~]# kill -9 %1;jobs
[1]+  已停止               find / -print
[root@192 ~]# jobs
[1]+  Killed                  find / -print
[root@192 ~]#find / -print
...
/proc/891/wchan
/proc/891/stack
/proc/891/schedstat
^Z
[1]+  已停止               find / -print
[root@192 ~]# kill -SIGTERM %1
[root@192 ~]# jobs 
[1]+  Terminated              find / -print

在这里插入图片描述


7、离线管理的问题

  • 在工作管理当中提到的后台指的是在终端机模式下可以避免 [ctrl]-c 中断的一个情景,你可以说那个是 bash的后台,并不是放到系统的后台
  • at 是将程序放置到系统后台,nohup 可以让你在离线或登出系统后,还能够让程序继续进行

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

[root@study ~]# vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."
[root@study ~]# chmod a+x sleep500.sh
[root@study ~]# nohup ./sleep500.sh &
[2] 14812
[root@study ~]#  nohup: ignoring input and appending output to `nohup.out' <==会告知这个信息!
[root@study ~]# exit

8、程序管理

1、nice/renice(重新定nice的值)

  • PRI 与NI 的相关性如下:

PRI(new) = PRI(old) + nice

  • nice 值可调整的范围为-20 ~ 19 ;
  • root 可随意调整自己或他人程序的Nice 值,且范围为-20 ~ 19 ;
  • 一般使用者仅可调整自己程序的Nice 值,且范围仅为0 ~ 19 (避免一般用户抢占系统资源);
  • 一般使用者仅可将nice值越调越高,例如本来nice 为5 ,则未来仅能调整到大于5;
[root@bogon ~]# nice -n -5 vim &
[1] 1747
[root@bogon ~]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY  
...
[1]+  已停止               nice -n -5 vim
[root@bogon ~]# kill -9 %1
[1]+  已停止               nice -n -5 vim
[root@bogon ~]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY   
...
[1]+  Killed                  nice -n -5 vim

2、系统资源的观察
free:

  • -b :直接输入 free时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes),k(Kbytes), 及 g(Gbytes) 来显示单位 也可以直接让系统自己指定单位 (-h)
  • -t :在输出的最终结果,显示硬盘与 swap 的总量。
  • -s :可以让系统每几秒输出出一次,不间断的一直输出的意思对于系统观察挺有效
  • -c :与 -s 同时处理~让free 列出几次的意思~
[root@bogon ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1800         226        1305           8         268        1417
Swap:          2047           0        2047

3、uptime:观察系统启动时间与工作负载

[root@bogon ~]# uptime
 10:47:21 up  4:00,  2 users,  load average: 0.00, 0.00, 0.00

4、 查阅系统与核心相关的信息
uname:

  • -a :所有系统相关的信息,包括底下的资料都会被列出來;
  • -s :系统核心名称
  • -r :核心的版本
  • -m :本系统的硬件名称,例如 i686 或 x86_64 等;
  • -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
  • -i :硬件的平台 (ix86)
[root@bogon ~]# uname -a
Linux bogon 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

5、追踪网路或插槽档
netstat :

  • -a :将目前系统上所有的连线、监听、Socket 资料都列出来
  • -t :列出 tcp 网路封包的资料
  • -u :列出 udp 网路封包的资料
  • -n :不以程序的服务名称,以端口号 (port number) 来显示;
  • -l :列出目前正在网络监听 (listen) 的服务;
  • -p :列出该网络服务的程序 PID
[root@bogon ~]# netstat 
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 bogon:ssh               bogon:50260             ESTABLISHED
udp        0      0 bogon:bootpc            bogon:bootps            ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  3      [ ]         DGRAM                    13311    /
...
[root@bogon ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      917/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      917/sshd            
udp        0      0 127.0.0.1:323           0.0.0.0:*                           861/chronyd         
udp6       0      0 ::1:323                 :::*                                861/chronyd         

6、由档案(或档案系统)找出正在使用该档案的程序
fuser:

  • -u :除了程序的 PID 之外,同时列出该程序的拥有者
  • -m :后面接的那个档名会主动的上提到该档案系统的最顶层,对 umount 不成功很有效
  • -v :可以列出每个档案与程序还有指令的完整相关性
  • -k :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个信号给予该PID;
  • -i :必须与 -k 配合,在刪除 PID 之前会先询问使用者意愿
  • -signal:例如 -1 -15 等等,若不加的話,默认是 SIGKILL (-9)
[root@bogon ~]# fuser -uv .
                     用户     进程号 权限   命令
/root:               root       1437 ..c.. (root)bash
                     root       1470 ..c.. (root)bash
[root@bogon ~]# fuser -uv /proc
                     用户     进程号 权限   命令
/proc:               root     kernel mount (root)/proc
[root@bogon ~]# fuser -muv .
                     用户     进程号 权限   命令
/root:               root     kernel mount (root)/
                     root          1 .rce. (root)systemd
                     root          2 .rc.. (root)kthreadd
                     root          3 .rc.. (root)rcu_gp
                     root          4 .rc.. (root)rcu_par_gp
                     root          6 .rc.. (root)kworker/0:0H

7、列出被程序所打开的文档名称
lsof :

  • -a :多项资料需要同时成立才显示出结果时
  • -U :仅列出 Unix like 系统的 socket 文档类型
  • -u :后面接 username,列出该使用者相关程序所打开的文档
  • +d :后面接目录,亦即找出某个目录底下已经被打开的文档
[root@bogon ~]# lsof -u root -a -U
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
systemd      1 root   15u  unix 0xffff992c559b7080      0t0 21437 /run/systemd/private type=STREAM
...
[root@bogon ~]# lsof +d /dev
COMMAND    PID           USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
systemd      1           root    0u   CHR    1,3      0t0    31 /dev/null
...
[root@bogon ~]# lsof -u root | grep bash
bash      1437 root  cwd       DIR              253,0       219   33575041 /root
bash      1437 root  rtd       DIR              253,0       224        128 /
...

8、找出某支正在执行的程式的 PID
pidof :

  • -s :仅列出一个 PID 而不列出所有的 PID
  • -x :同时列出该 program name 可能的 PPID 那个程序的 PID
[root@bogon ~]# pidof systemd rsyslogd
1431 1426 1
  • 常见问题:
    1、eg:/usr/local/bin/ls与/bin/ls那么当我下达ls 的时候,哪个ls会被执行?
    答:/user/local/bin/ls会被执行,越前面的越先被 执行
    2、
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++链表实现进程管理的示例代码: ```cpp #include <iostream> #include <string> #include <algorithm> using namespace std; struct Process { string proname; int time, pri; bool status; }; struct Node { Process val; Node* next; Node(Process x) : val(x), next(NULL) {} }; class Linklist { public: Node* head; Linklist(); void Insert(Process val, int pos); void Remove(Process val); void Print(); int Find(Process val); int Length(); ~Linklist(); private: int length; }; Linklist::Linklist() { head = NULL; length = 0; } void Linklist::Insert(Process val, int pos) { if (pos < 0 || pos > length) { cout << "Invalid position!" << endl; return; } Node* newNode = new Node(val); if (pos == 0) { newNode->next = head; head = newNode; } else { Node* curr = head; for (int i = 0; i < pos - 1; i++) { curr = curr->next; } newNode->next = curr->next; curr->next = newNode; } length++; } void Linklist::Remove(Process val) { Node* curr = head; Node* prev = NULL; while (curr != NULL) { if (curr->val.proname == val.proname) { if (prev == NULL) { head = curr->next; } else { prev->next = curr->next; } delete curr; length--; return; } prev = curr; curr = curr->next; } cout << "Process not found!" << endl; } void Linklist::Print() { Node* curr = head; while (curr != NULL) { cout << "Process Name: " << curr->val.proname << endl; cout << "Priority: " << curr->val.pri << endl; cout << "Running Time: " << curr->val.time << endl; cout << "Status: " << (curr->val.status ? "Running" : "Not Running") << endl; cout << endl; curr = curr->next; } } int Linklist::Find(Process val) { Node* curr = head; int pos = 0; while (curr != NULL) { if (curr->val.proname == val.proname) { return pos; } curr = curr->next; pos++; } return -1; } int Linklist::Length() { return length; } Linklist::~Linklist() { Node* curr = head; Node* next = NULL; while (curr != NULL) { next = curr->next; delete curr; curr = next; } } int main() { Linklist processList; Process p1 = { "Process1", 10, 2, true }; Process p2 = { "Process2", 5, 1, false }; Process p3 = { "Process3", 8, 3, true }; processList.Insert(p1, 0); processList.Insert(p2, 1); processList.Insert(p3, 2); processList.Print(); processList.Remove(p2); processList.Print(); int pos = processList.Find(p3); if (pos != -1) { cout << "Process found at position: " << pos << endl; } else { cout << "Process not found!" << endl; } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值