03-Linux进程与服务控制

本文详细介绍了Linux的进程管理,包括进程的分类、属性、父子进程关系、进程管理工具如ps、kill、pgrep等的使用。同时,文章讲解了Linux服务管理,特别是服务的启动脚本和服务命令如service的运用,以及如何重启网络服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux进程管理

程序和进程,进程的分类

程序是为了完成某种任务而设计的软件,vi编辑器是程序。

 

进程就是运行中的程序。 一个运行着的程序,可能有多个进程。

apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户来同时请求httpd服务,apache服务器将会创建有多个httpd进程来对其进行服务。

 

进程一般分为交互进程、批处理进程和守护进程三类。

守护进程总是活跃的,一般是后台运行,一般是由系统在开机时通过脚本自动激活启动,由超级管理用户root来启动。 

例如在Redhat中,我们可以定义httpd 服务器的启动脚本的运行级别,此文件位于/etc/init.d目彔下,文件名是httpd,/etc/init.d/httpd 就是httpd服务器的守护程序,当把它的运行级别设置为3和5时,当系统启动时,它会跟着启动。

进程的属性

进程IDPID):是唯一的数值,用来区分进程;

父进程和父进程的IDPPID)

启动进程的用户IDUID)和所归属的组(GID);

进程状态:状态分为运行R、休眠S、僵尸Z

进程执行的优先级;

进程所连接的终端名;

进程资源占用:比如占用资源大小(内存、CPU占用量);

父进程和子进程

父进程和子进程的关系是管理和被管理的关系,当父程终止时,子进程也随而终止。但子进程终止,父进程一定终止。

例如httpd服务器运行时,我们可以杀掉其子进程,父进程会因为子进程的终止而终止。

进程管理中,当我们发现占用资源过多的进程时,可以考虑杀死它,以保护系统的稳定安全运行。

1.子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程.
2.在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境.
3.父进程终止子进程自然终止。

进程管理

对于Linux进程的管理,是通过进程管理工具实现的,如

ps

kill

pgrep等工具。

 

ps监视进程工具

ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不是动态连续的;

 (进程时间监控,可使top工具;

名称:ps 
使用权限:所有使用者 
使用方式:ps [options] [--help] 
说明:显示瞬间行程 (process) 的动态 
常见参数: 
-A 列出所有的行程 
-w 显示加宽可以显示较多的资讯 
-au 显示较详细的资讯 
-aux 显示所有包含其他使用者的行程

ps命令

ps

-l 长格式输出;

-u 按用户名和启动时间的顺序来显示进程;

-j 用任务格式来显示进程;

-f 用树形格式来显示进程;

-a 显示所有用户的所有进程(包括其它用户);

-x 显示无控制终端的进程;

-r 显示运行中的进程;

我们常用的选项是组合是aux lax,还有参数f的应用

ps aux(lax)
USER 进程的属主; PID 进程的ID; PPID 父进程; %CPU 进程占用的CPU百分比; %MEM 占用内存的百分比; PRI 代表这个程序可被执行的优先级;NI 进程的NICE值,数值大,表示较少占用CPU时间; VSZ 进程虚拟大小;  TTY 终端ID STAT 

进程状态

D 不间断的睡眠(usually IO)

R 正在运行中在队列中可过行的;

S 处于休眠状态;

T 停止或被追踪;

W 进入内存交换(从内核2.6开始无效);

X 死掉的进程(从来没见过);

Z 僵尸进程; < 优先级高的进程 N 优先级较低的进程

L 有些页被锁进内存; s 进程的领导者(在它之下有子进程);

l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + 位于后台的进程组;

WCHAN 正在等待的进程资源; START 启动进程的时间;

Linux进程状态:R (TASK_RUNNING),可执行状态。
只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。
Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态。
处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,因此绝大多数进程都在睡眠。
Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。
与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将发现kill -9杀不死一个正在睡眠的进程了。于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。
而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。
在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。

查看进程的实例

ps aux 最常用的参数组合

| 管道和 more 连接起来分页查看:

[root@localhost ~]# ps -aux | more

这里是把所有进程显示出来,并输出到ps001.txt文件,然后再通过more 来分页查看:

[root@localhost ~]# ps -aux > ps001.txt

[root@localhost ~]# more ps001.txt


grep 结合,提取指定程序的进程

[root@localhost ~]# ps aux | grep httpd

root 4187 0.0 1.3 24236 10272 ? Ss 11:55 0:00 /usr/sbin/httpd

apache 4189 0.0 0.6 24368 4940 ? S 11:55 0:00 /usr/sbin/httpd

 

ps 查看隶属自己的进程
        [root@localhost ~]# ps
        PID TTY TIME CMD
        1370 pts/0 00:00:00 bash
        3185 pts/0 00:00:00 ps
        [root@localhost ~]# ps -l
        F S    UID  PID     PPID    C   PRI   NI   ADDR   SZ     WCHAN     TTY      TIME      CMD
        4 S    0     5941   5801   4   80    0   -       1882   wait      pts/2    00:00:00     bash
        4 R    0     6000   5941   0   80    0   -       1121    -         pts/2    00:00:00     ps
 选项具体含义    
        PID :     进程号
        PPLD:   父进程的进程号
        TTY :     进程启动的终端
        STAT :   进程当前状态(S休眠状态,D不可中断的休眠状态,R运行状态,Z僵死状态,T停止)
        NI :       进程优先级
        TIME:    进程自从启动以后启用CPU的总时间
        COMMAND/CMD:进程的命令名
        USER:    用户名
        %CPU:   占用CPU时间和总时间的百分比
        %MEM:  占用内存与系统内存总量的百分比


pgrep查询进程

pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了。

pgrep 参数选项 程序名 常用参数

-l 列出程序名和进程ID

-o 进程起始的ID

-n 进程终止的ID

[root@localhost ~]# pgrep -lo httpd
4557 httpd
[root@localhost ~]# pgrep -ln httpd 
4566 httpd

top-监视系统任务的工具

top是动态监视系统任务的工具,输出的结果是连续的。参数选项如下:

 

-b   以批量模式运行,但不能接受命令行输入;

-c   显示命令行,而不仅仅是命令名;

 -d N   显示两次刷新时间的间隔,如 -d 5,表示两次刷新间隔为5秒;

-i   禁止显示空闲进程或僵尸进程;

-n NUM 显示更新次数,然后退出。

  -n 5,表示top更新5次数据就退出;

-p PID   仅监视指定进程的IDPID是一个数值;

-q   不经任何延时就刷新;

-s   安全模式运行,禁用一些指令;

-S   累积模式,输出每个进程的总的CPU时间,包括已死的子进程;

[root@localhost ~]# top
[root@localhost ~]# top > mytop.txt

终止进程的工具

终止进程的工具kill killallpkill

终止一个程和终止一个正在运行的程序,一般是通过 kill killallpkillxkill 等迚行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。


winddow下面,我们要结束一个进程,最简单的方式就是关闭这个程序,相应的进程也会随之结束,遇到不能关闭的情况。会打开任务管理器结果掉。在linux下我们可以使用kill命令来终止进程。
    
    为什么要杀死进程?
        * 该进程点用了过多的CPU时间
        * 该进程缩住了一个终端,使其他前台进程无法运行
        * 运行时间过长,但没有预期效果
        * 产生了过多到屏幕或磁盘文件的输出
        * 无法正常退出


使用kill工具终止进程

kill [信号代码] 进程ID

注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;

 

[root@localhost ~]# ps auxf |grep httpd

root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep httpd

root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd

apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd

……

apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

上面例子中的第二列,即进程PID的列,其中4830httpd服务器的父进程,从48334840进程都是它4830的子进程

[root@localhost ~]# kill 4840  杀掉4840这个进程;

[root@localhost ~]# ps -auxf |grep httpd  查看一下httpd服务器运行状态

[root@localhost ~]# kill 4830  杀掉httpd的父进程;

[root@localhost ~]# ps -aux |grep httpd 查看httpd服务器运行状态

杀掉父进程4830,子进程也会跟着死掉;

对于僵尸进程,可以用kill -9 来强制终止退出。


 

[root@localhost ~]# kill -l
        1SIGHUP    2SIGINT    3SIGQUIT    4SIGILL    5SIGTRAP
        6SIGABRT    7SIGBUS    8SIGFPE    9SIGKILL    10SIGUSR1
        11SIGSEGV    12SIGUSR2    13SIGPIPE    14SIGALRM    15SIGTERM
        16SIGSTKFLT    17SIGCHLD    18SIGCONT    19SIGSTOP    20SIGTSTP
        21SIGTTIN    22SIGTTOU    23SIGURG    24SIGXCPU    25SIGXFSZ
        26SIGVTALRM    27SIGPROF    28SIGWINCH    29SIGIO    30SIGPWR
        31SIGSYS    34SIGRTMIN    35SIGRTMIN+1    36SIGRTMIN+2    37SIGRTMIN+3
        38SIGRTMIN+4    39SIGRTMIN+5    40SIGRTMIN+6    41SIGRTMIN+7    42SIGRTMIN+8
        43SIGRTMIN+9    44SIGRTMIN+10   45SIGRTMIN+11   46SIGRTMIN+12   47SIGRTMIN+13
        48SIGRTMIN+14   49SIGRTMIN+15   50SIGRTMAX-14   51SIGRTMAX-13   52SIGRTMAX- 12
        53SIGRTMAX-11   54SIGRTMAX-10   55SIGRTMAX-9    56SIGRTMAX-8    57SIGRTMAX-7
        58SIGRTMAX-6    59SIGRTMAX-5    60SIGRTMAX-4    61SIGRTMAX-3    62SIGRTMAX-2
        63SIGRTMAX-1    64SIGRTMAX
    
    我们看到每个编号对应一个含义,如 9SIGKILL ;9标注的是SIGKILL ,那么我们可用9来终止进程。


终止进程的工具

killall 正在运行的程序名

killall 通过程序的名字,直接杀死所有进程。

pkill 正在运行的程序名


killall 通过程序的名字,直接杀死所有进程。用法:killall <正在运行的程序名
 
killall 可以和pspgrep 结合使用,通过pspgrep 来查看哪些程序在运行,然后将程序结束
 
例:
 [root@localhost beinan]# pgrep -l gaim
 2979 gaim
 [root@localhost beinan]# killall gaim

pkill killall 应用方法差不多,也是直接杀死运行中的程序


Linux服务管理

服务的种类

系统服务

某些服务的服务对象是Linux系统本身,或者Linux系统用户,这类的服务我们称为系统服务(System Service

网络服务

提供给网络中的其他客户端(Clients)调用使用的服务,这类的服务我们统称为网络服务(Networking Service

服务的管理

为了简化Linux服务管理的麻烦,Linux特别为每一个独立式的服务,提供了一个服务启动程序文件(Service Startup Script)。

所有的服务启动文件被储存在/etc/rc.d/init.d/目录下。目录下每一个文件就是某一个服务的启动程序文件,可以直接执行某一个启动程序文件,借以来启动或者停止该服务。也可用service命令的方法启动管理。


 

service命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。相关的命令还包括chkconfigntsysv等。

chkconfig用于查看、设置服务的运行级别,ntsysv用于直观方便的设置各个服务是否自动启动。service命令本身是一个shell脚本,它在/etc/init.d/目录查找指定的服务脚本,然后调用该服务脚本来完成任务。

Linux的服务都是以脚本的方式来运行的,存在于 /etc/rc.d/init.d目录下所有的脚本就是我们的服务脚本,它具有两项作用,一项是能够在系统启动的时候自动启动那些脚本中所要求启动的程 序,另外,我们还能够通过该脚本来对服务进行控制,比如启动,停止等。


service 服务名称 动作参数

其中动作参数可以使用

- start: 启动这个服务

- stop: 停止这个服务

- restart: 先停止,再启动,也就是重新启动的意思。

- reload: 重载配置文件,只有在服务已经启动的状况下才能使用。

- condrestart:有条件的重新启动,这个服务必须是已经启动的,才会被重新启动;如果这个服务尚未启动,则无须启动之。

- status: 查看目前服务的启动状态。


例:网络重启

当修改了主机名、ip地址等信息时,经常需要把网络重启使之生效。


[root@node34 root]# service network status
配置设备:
lo eth0
当前的活跃设备:
lo eth0
[root@node34 root]# service network restart

正在关闭接口 eth0:                                        确定  ]
关闭环回接口:                                             确定  ]
设置网络参数:                                             确定  ]
弹出环回接口:                                             确定  ]
弹出界面 eth0:                                            确定  ]


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值