LINUX基础培训七之进程管理

发布时间:2024年01月14日
前言、本章学习目标?
  1. 了解LINUX中进程和程序
  2. 掌握进程管理的作用和方法
  3. 熟悉进程调度优先级
  4. 了解LINUX信号

一、了解LINUX进程和程序

进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。

程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。

这么讲很难理解,那我们换一种说法。程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合。而进程是正在执行中的程序。当程序被执行时,执行人的权限和属性,以及程序的代码都会被加载入内存,操作系统给这个进程分配一个 ID,称为 PID(进程 ID)。

也就是说,在操作系统中,所有可以执行的程序与命令都会产生进程。只是有些程序和命令非常简单,如 ls 命令、touch 命令等,它们在执行完后就会结束,相应的进程也就会终结,所以我们很难捕捉到这些进程。但是还有一些程序命令,比如 httpd 进程,启动之后就会一直驻留在系统当中,我们把这样的进程称作常驻内存进程

父进程与子进程:

父进程(英语:Parent Process)指已创建一个或多个子进程的进程,一个进程创建新进霍称为创建了子进程(Child Process),创建子进程的进程称为父进程。 ,当进程启动另一个程序时,新进程称为其子进程,原始进程是其进程的父进程,子选程从此父进程继承特性,如环境以及运行的用户和组.

在linux里,除了进程0(英语:Linux startup process)((即PID=0的交换进程,Swapperprocess)以外的所有进程都是由其他进程使用系统调用fork(英语:Fork (operatingsysteml)创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程。

他们的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止,父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。在Linux进程管理中,当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行。

二、进程管理

1、进程管理的作用

1) 判断服务器的健康状态
运维工程师最主要的工作就是保证服务器安全、稳定地运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。

2) 查看系统中所有的进程
我们需要查看看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务、是否有非法服务在运行。

3) 杀死进程
这是进程管理中最不常用的手段。当需要停止服务时,会通过正确关闭命令来停止服务(如 apache 服务可以通过 service httpd stop 命令来关闭)。只有在正确终止进程的手段失效的情况下,才会考虑使用 kill 命令杀死进程。
?

2、ps查看正在运行的进程

ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。
命令的基本格式如下:
[root@localhost ~]# ps aux
#查看系统中所有的进程,使用 BS 操作系统格式
[root@localhost ~]# ps -le
#查看系统中所有的进程,使用 Linux 标准命令格式

选项:
a:显示一个终端的所有进程,除会话引线外;
u:显示进程的归属用户及内存的使用情况;
x:显示没有控制终端的进程;
-l:长格式显示更加详细的信息;
-e:显示所有进程;
可以看到,ps 命令有些与众不同,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是前面不能带“-”。

[root@localhost ~]# ps aux
#查看系统中所有的进程
USER PID %CPU %MEM ?VSZ ?RSS ? TTY STAT START TIME COMMAND
root ? 1 ?0.0 ?0.2 2872 1416 ? ? ? Ss ? Jun04 0:02 /sbin/init
root ? 2 ?0.0 ?0.0 ? ?0 ? ?0 ? ? ? ?S ? Jun04 0:00 [kthreadd]
root ? 3 ?0.0 ?0.0 ? ?0 ? ?0 ? ? ? ?S ? Jun04 0:00 [migration/0]
root ? 4 ?0.0 ?0.0 ? ?0 ? ?0 ? ? ? ?S ? Jun04 0:00 [ksoftirqd/0]

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

3、top持续监听进程运行状态

top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
top 命令的基本格式如下:
[root@localhost ~]#top [选项]
选项:
-d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
-b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
-n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
-p 进程PID:仅查看指定 ID 的进程;
-s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
-u 用户名:只监听某个用户的进程;
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
? 或 h:显示交互模式的帮助;
P:按照 CPU 的使用率排序,默认就是此选项;
M:按照内存的使用率排序;
N:按照 PID 排序;
T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
r:按照 PID 给某个进程重设优先级(Nice)值;
q:退出 top 命令;

示例:

[root@localhost ~]# top
top - 12:26:46 up 1 day, 13:32, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 99.7%id, 0.1%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 625344k total, 571504k used, 53840k free, 65800k buffers
Swap: 524280k total, 0k used, 524280k free, 409280k cached
PID ? USER PR NI VIRT ?RES ?SHR S %CPU %MEM ? TIME+ COMMAND
19002 root 20 ?0 2656 1068 ?856 R ?0.3 ?0.2 0:01.87 top
1 ? ? root 20 ?0 2872 1416 1200 S ?0.0 ?0.2 0:02.55 init
2 ? ? root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.03 kthreadd
3 ? ? root RT ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 migration/0
4 ? ? root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.15 ksoftirqd/0
5 ? ? root RT ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 migration/0
6 ? ? root RT ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:10.01 watchdog/0
7 ? ? root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:05.01 events/0
8 ? ? root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 cgroup
9 ? ? root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 khelper
10 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 netns
11 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 async/mgr
12 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 pm
13 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:01.70 sync_supers
14 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.63 bdi-default
15 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 kintegrityd/0
16 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:02.52 kblockd/0
17 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 kacpid
18 ? ?root 20 ?0 ? ?0 ? ?0 ? ?0 S ?0.0 ?0.0 0:00.00 kacpi_notify

三、LINUX进程优先级

Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。但是 CPU 在一个时钟周期内只能运算一条指令(现在的 CPU 采用了多线程、多核心技术,所以在一个时钟周期内可以运算多条指令。 但是同时运算的指令数也远远小于系统中的进程总数),那问题来了:谁应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了。
Linux默认情况下每个进程对CPU时间的占用权限相等,调度优先性决定对CPU的占用情况
·使用ps aux、top等命令可以查看进程的nice值.
·nice可用于设置新进程的nice值。
·renice和top都可以用于更改正在运行的进程的nice值,以调整进程的优先权.·nice值的范围从-20(非常希望占用其他进程的CPU时间)到19(非常愿意将C时间让给其他进程),默认为0,低nice值意味着高cpu优先级.
·一般使用者仅可调整自己程序的Nice值,且范围仅为0~19(避免一般用户抢占系统资源);一般使用者仅可将nice值越调越高,例如本来nice为5,则未来仅能调整到大于5;
root可随意调整自己或他人程序的Nice值,且范围为-20~19。

在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。
其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。

?四、LINUX信号

Linux信号是最基本的进程同通讯机制,就是进程之间通信的信息,操作系统通过信号与选程通信,这些信号向进程报告事件或错误情况。
直接发送给进程,不需要用户界面
程序给每个信号关联动作
发送信号可以使用名称或号码:
以下是主要的讯号代号与名称对应及内容:

五、如何kill终止进程

kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
kill 命令的基本格式: kill [信号] PID
killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。
killall 命令的基本格式: killall [选项] [信号] 进程名


?

六、LINUX计划任务

类似于windows的计划任务、oracle数据库的job,按照设置定时执行;

root用户和普通用户都可以配置计划任务,普通用户下的shell脚本,可以用root用户代为执行,例如用root用户做数据库备份;

类似oarcle之类的普通用户,定时脚本需要注意环境变量,要把配置文件.bash_profile里的路径等变量带入定时任务,否则会导致定时任务执行失败,找不到执行命令。可以把.bash_profile里的所有内容放入脚本,或者在脚本里直接执行.bash_profile。

定时器里的shell脚本前面要有具体的路径名称,例如“/data/bak/ftp.sh”,否则会出现找不到shell脚本的情况。

crontab命令用法:

命令格式:
M H D m d command
M: 分钟(0-59)
H:小时(0-23)
D:天(1-31)
m: 月(1-12)
d: 一星期内的天(0~6,0为sunday星期天)
command:要运行的程序

例1,每隔2分钟做一次时间同步:
*/2 * * * * rdate -s time_srv1

例2,每周六晚上22:30做一次ftp异地备份:
30 22 * * 6 /data/bak/ftp.sh

例3,数据库备份定时器配置步骤:

1)切换到oracle用户,创建备份脚本
# su - oracle
$ cat > /databak/rman_bak/scripts/rman_back.sh
su - oracle << EOF
find /databak/rman_bak/logs -name "*.log" -ctime +30 -exec rm -f {} \;
rman target / >/databak/rman_bak/logs/rman_back_`date +%Y-%m-%d`.log
run{
backup database plus archivelog delete input;
delete noprompt obsolete;
}
EOF

2)使用oracle用户,赋予执行权限
$ chmod +x /databak/rman_bak/scripts/rman_back.sh

3)使用root用户,创建定时器,每天凌晨01:30执行
# crontab -e
30 01 * * * /databak/rman_bak/scripts/rman_back.sh
?

七、本章实验

·1、用top和ps命令查找sshd服务进程的相关信息。
·2、用户natasha必须配置一个cron job ,当地时间每天14:23运行,执行/bin/echo hiya 。

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