RHEL6基础之十七init进程、服务及其管理

1、进程的概念
进程是系统中正在运行的程序,它是操作系统资源分配和调度的基本单位。
在Linux系统中,并非每个程序只能对应一个进程,有的程序启动后可以创建一个或多个进程,例如提供Web服务的httpd程序,当有大量用户同时访问web页面时,httpd程序可能会创建多个进程来提供服务。

在进程的运行过程中,通常会在3种基本状态之间转换:运行态、就绪态、等待态(阻塞态)。

运行态:是指当前进程已分配到CPU,它的程序正在处理器上执行时的状态。处于运行态的进程个数不能大于CPU的数目,在一般单CPU机制中,任何时刻处于运行态的进程最多有一个。
就绪态:是指进程已具备运行条件,但因为其他进程正占用CPU,所以暂时不能运行而等待分配CPU的状态。一旦把CPU分给它,立即就可以运行。在操作系统中,处于就绪态的进程数目可以是多个。
等待态(阻塞态):是指进程因等待某种事件发生(如等待某一输入、输出操作完成,等待其它进程发来的信号等)而暂时不能运行的状态。此时即使CPU空闲,等待态的进程也不能运行。系统中处于这种状态的进程也可以是多个。
Linux系统中的进程使用数字进行标记,每个进程的身份标记号称为PID。如在Linux系统的启动过程中,“/sbin/init”是内核加载运行的第一个程序,相应的init进程对应的pid号永远为1。

2、服务的概念

在Linux中有一些特殊的程序,启动后就会持续在后台执行,等待用户或其它软件调用,这种程序称为服务。
Linux系统中提供了很多服务,这些服务依照其功能可以区分为系统服务与网络服务。
系统服务:某些服务的服务对象是Linux系统本身,或者是Linux系统中的用户。
网络服务:Linux系统中更多的服务是用来提供给网络中的其他客户端调用。例如提供远程登录的sshd服务,提供网站浏览功能的httpd服务等。

3、init进程与系统运行级别

init服务是Linux系统中第一个被执行的程序,它主要负责建立系统使用环境,并确保系统正常运行。

init服务运行以后将陆续执行系统中的其它程序,不断生成新的进程,这些进程称为init进程的子进程,反过来说init进程是这些进程的父进程。这些子进程也可以进一步生成各自的子进程,依此不断繁衍下去,最终构成一棵枝繁叶茂的进程树,共同为用户提供服务。所以,init进程是维持整个Linux系统运行的所有进程的始祖,init进程是不允许被轻易终止的。

init服务的配置文件是/etc/inittab
/etc/inittab文件的主要内容:

# Default runlevel. The runlevels used are:
关机状态,使用该级别时将会关闭主机
#   0 - halt (Do NOT set initdefault to this)
单用户模式,不需要密码验证即可登录系统,多用于系统维护
#   1 - Single user mode
字符界面的多用户模式(不支持网络)
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
字符界面的完整多用户模式,大多数服务器主机运行在此级别
#   3 - Full multiuser mode
未分配使用
#   4 - unused
图形界面的多用户模式,提供了图形桌面操作环境
#   5 - X11
重新启动,使用该级别时将会重启主机
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
[root@justin ~]#

若未能确知当前所处的运行级别,可以使用runlevel命令进行查询,输出结果中分别包含切换前的级别和目前的级别。查看系统的当前运行级别,若之前未切换过运行级别,第一列将显示“N”

[root@justin ~]# runlevel
N 5
[root@justin ~]# init 3
[root@justin ~]# runlevel
5 3
[root@justin ~]#

init命令只能临时切换运行级别,要实现永久切换必须修改配置文件/etc/inittab起实质作用的最后这一行:id:5:initdefault:,这一行决定了系统的默认运行级别。默认运行级别一般建议设置为5或3,千万不要设置为0或6,否则将导致系统无法启动。由于Linux主要是作为服务器操作系统,Linux服务器平时一般都是放置在数据中心机房中,由管理员对其进行远程管理。对Linux系统的管理操作一般都是在字符界面下通过命令完成的,很少用到图形界面,而且图形界面也要消耗更多的系统资源,同时也会导致系统不稳定,所以大多数情况下系统的运行级别都是被设置为3。

4、进程状态查看

ps命令——查看静态的进程统计信息

151553167.png

-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l 长格式(有F,wchan,C 等字段)
-j 作业格式   www.2cto.com  
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
h 不显示第一行


ps -eo lstart 启动时间
ps -eo etime   运行多长时间.显示了自从该进程启动以来,经历过的时间,格式为 [[DD-]hh:]mm:ss。
ps -eo etimes   运行多长时间.显示了自该进程启动以来,经历过的时间,以秒的形式。

[root@Super ~]# ps -p 17274 -o etimes
ELAPSED
 683680
[root@Super ~]# ps -p 17274 -o etime
    ELAPSED
 7-21:54:44
[root@Super ~]#



-C cmdline 列出指定命令的状况    --no-header 忽略头部

cmdline为完整命令行,可以理解成启动程序的执行文件,如nginx、redis-server等

[root@localhost logs]# ps -C haproxy
  PID TTY          TIME CMD
 1943 ?        00:00:00 haproxy
 1944 ?        00:00:00 haproxy
[root@localhost logs]# ps -C haproxy --no-header
 1943 ?        00:00:00 haproxy
 1944 ?        00:00:00 haproxy
[root@localhost logs]#
[root@justin ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  2137  2135  0  80   0 -  1714 -      pts/0    00:00:00 bash
4 R     0  2336  2137  0  80   0 -  1619 -      pts/0    00:00:00 ps
[root@justin ~]#

154031377.png

[root@justin ~]# ps -aux|more
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   2880  1492 ?        Ss   Oct21   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Oct21   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Oct21   0:00 [migration/0]

155314104.png

aux:

UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完整的终端名称
TIME:CPU时间
CMD:完整的启动进程所用的命令和参数


-ef:

USER:用户名称
PID:进程号
%CPU:进程占用CPU的百分比
%MEM:进程占用物理内存的百分比
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
TT:终端名称(缩写),若为?,则代表此进程与终端无关,因为它们是由系统启动的
STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
STARTED:进程的启动时间
TIME:CPU时间,即进程使用CPU的总时间
COMMAND:启动进程所用的命令和参数,如果过长会被截断显示

如果想查看进程的CPU占用率和内存占用率,可以使用aux
如果想查看进程的父进程ID和完整的COMMAND命令,可以使用ef


查看某个进程文件的启动位置

通过ps查看进程的PID,进入/proc/pid通过ls -al查看,cwd就是你要查找进程的位置,exe连接的就是启动的文件

blob.png


查看线程

 ps -Lf pid 查看对应进程下的线程数

[root@localhost ~]# ps -Lf 21804
UID        PID  PPID   LWP  C NLWP STIME TTY      STAT   TIME CMD
root     21804     1 21804  0    3 Aug23 ?        Ssl    1:00 /app/redis/bin/redis-server 0.0.0.0:8003
root     21804     1 21806  0    3 Aug23 ?        Ssl    0:00 /app/redis/bin/redis-server 0.0.0.0:8003
root     21804     1 21807  0    3 Aug23 ?        Ssl    0:00 /app/redis/bin/redis-server 0.0.0.0:8003
[root@localhost ~]#

ps -mq PID  看到指定的进程产生的线程数目。

[root@localhost ~]# ps -mq 21804
  PID TTY          TIME CMD
21804 ?        00:01:00 redis-server
    - -        00:01:00 -
    - -        00:00:00 -
    - -        00:00:00 -
[root@localhost ~]#

ps -xH     查看所有存在的线程,也可以使用grep作进一步的过滤。


ps -T  -p <pid>    “-T”选项可以开启线程查看

[root@localhost ~]# ps -T -p 21804
  PID  SPID TTY          TIME CMD
21804 21804 ?        00:01:00 redis-server
21804 21806 ?        00:00:00 redis-server
21804 21807 ?        00:00:00 redis-server
[root@localhost ~]#

SPID表示线程ID,而“CMD”栏则显示了线程名称。


top -H -p <pid>  显示特定进程<pid>运行的线程状况

[root@localhost ~]# top -H -p 21804
top - 21:03:00 up 65 days, 14:04,  4 users,  load average: 0.58, 0.54, 0.47
Threads:   3 total,   0 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.6 us,  0.5 sy,  0.0 ni, 98.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 13186529+total, 10831592 free, 11688337+used,  4150328 buff/cache
KiB Swap: 16776188 total,  1034656 free, 15741532 used. 14501072 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                              
21804 root      20   0  131356   1204    208 S  0.0  0.0   1:00.28 redis-server                                                         
21806 root      20   0  131356   1204    208 S  0.0  0.0   0:00.00 redis-server                                                         
21807 root      20   0  131356   1204    208 S  0.0  0.0   0:00.00 redis-server

ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M[8192]

[root@localhost ~]# ulimit -s
8192
[root@localhost ~]#

查看最大线程数:cat /proc/sys/kernel/threads-max

[root@localhost ~]# cat /proc/sys/kernel/threads-max 
1029958
[root@localhost ~]#


top命令——查看进程动态信息

top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每3秒钟刷新一次,其作用类似于Windows系统中的“任务管理器”。由于过于消耗资源,所以在生产环境中top命令用的比较少

[root@justin ~]# top
top - 00:49:40 up  2:50,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  92 total,   1 running,  88 sleeping,   3 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   1030796k total,   172808k used,   857988k free,    22008k buffers
Swap:  2097144k total,        0k used,  2097144k free,   108184k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND              
 2493 root      20   0  2652 1076  868 R  0.2  0.1   0:00.24 top                   
    1 root      20   0  2880 1492 1268 S  0.0  0.1   0:02.29 init                  
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd

091854454.png

第三行:cpu状态

6.7% us — 用户空间占用CPU的百分比。

0.4% sy — 内核空间占用CPU的百分比。

0.0% ni — 改变过优先级的进程占用CPU的百分比

92.9% id — 空闲CPU百分比

0.0% wa — IO等待占用CPU的百分比

0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比

0.0% si — 软中断(Software Interrupts)占用CPU的百分比

us占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有教低的id,说明CPU空转时间很少;

wa低,id高,可以排除CPU资源瓶颈的可能。 

wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的 I/O资源。


第四行Mem行展示了当前内存的状态,total是总的内存大小,userd是已使用的,free是剩余的,buffers是目录缓存。


第五行Swap行同Mem行,cached表示缓存,用户已打开的文件。如果Swap的used很高,则表示系统内存不足。


PID----进程id

USER--进程所有者的用户名

PR-----进程的优先级

NI------nice值,负值表示更高的优先级,正值表示低优先级

VIRT---进程使用的虚拟内存总量,单位为kb。其中VIRT=SWAP RES

RES----进程使用的、未被换出的物理内存的大小,单位为kb。

SHR---共享内存的大小,单位为kb

S-------进程状态

    D---不可中断的睡眠状态

    R---运行

    S---睡眠

    T---跟踪/停止

    Z---僵尸进程

%CPU--上次更新到现在的CPU时间占用比

%MEM--进程使用的物理内存百分比

TIME ---进程使用的CPU时间总计,单位为1/100秒

COMMAND---命令行/命令名,

      按c键可以查看command的详细命令

      i忽略闲置和僵尸进程。这是一个开关式的命令;

更改显示列的方法:

    a)通过f键可以选择显示的内容,按f键后会显示列的列表,按a-z即可显示或隐藏对应的列,最后按回车键确定;

    b)按o键可以改变列的显示顺序。按小写的a-z可以将相应的列向右移动,而大写的A-Z可以将相应的列向左移动。最后按回车键确定;

    c)按大写F或O键,然后按a-z可以将进程按照相应的列进行排序。而大写的R键可以将当前的排序倒转;


在top界面直接输入top指令就可以做显示做相应筛选

093841615.png

命令参数:

-b 批处理

-c 显示完整的治命令

-I 忽略失效过程

-s 保密模式

-S 累积模式

-i<时间> 设置间隔时间,模式3s

-u<用户名> 指定用户名

-p<进程号> 指定进程

-n<次数> 循环显示的次数

[root@localhost ~]# top -n 5 -i1 -p 1190 -c


敲击键盘“x”(打开/关闭排序列的加亮效果)

通过”shift + >”或”shift + <”可以向右或左改变排序列

QQ截图20180614100045.jpg


查看指定进程

[root@localhost ~]# pidof mongod
30172
[root@localhost ~]# top -p `pidof mongod`
top - 09:34:53 up 26 days, 22:07,  1 user,  load average: 0.03, 0.05, 0.05
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.6 us,  0.1 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 65809140 total,  4673868 free, 23277540 used, 37857732 buff/cache
KiB Swap: 16777212 total, 16776044 free,     1168 used. 42127064 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                        
30172 root      20   0 25.958g 0.021t   8868 S  10.3 34.6   1481:53 mongod

pidof查看进程PID

cpu使用率load average的简单理解

load average后面有由逗号分割的3列数字,分别代表了最近1分钟,5分钟,15分钟CPU的平均负载情况

如果是单核CPU的话,1.00就表示CPU已经满负荷了,

如果是多核CPU的话,load average达到CPU的核数即说明该CPU已经满负荷了,

如果是多颗物理CPU,则当load average达到所有物理CPU的总核数时,说明系统CPU满负荷了。

简而言之,CPU的核数即为我们根据load average衡量CPU负载的依据,当load average等于CPU的核数时,表示CPU在满负荷运行。

按大键盘上的数字键1(感叹号的1)可以查看每个CUP的使用率,top里显示的是把所有使用率加起来的,所以用top命令查看cpu利用率时会超过100%

wKiom1mcvpuTNwCWAAEKzT9cmTM555.jpg

核数可以通过命令cat /proc/cpuinfo | grep "core id" | uniq | wc -l查看数值, 这里不包含超线程技术HT虚拟出来的核心,因为超线程虚拟出来的核心性能不及真实核心的30%, 

1分钟的数据更能反映CPU负载的实时情况,而15分钟的数据则说明系统稳定在某一情况,更有指示价值,监视一个系统的负载情况的话最好是取15分钟的load average值。那么当CPU负载达到哪个值时,就该引起我们注意了呢?按照参考文章给的经验值是CPU核数乘以0.7,即如果CPU总核数为4,当load average上15分钟的数值达到2.8时,我们就该好好进系统看看了。


进程控制

1、程序后台运行

让操作在后台运行只需要在命令结尾加上符号&

[root@justin ~]# top &
[1] 4299
[root@justin ~]#

显示的信息为任务编号1和pid为4294

2、挂起进程:ctrl+z

当需要将当前在执行的命令暂停时直接按ctrl+z组合键就可以挂起当前进程,这种操作在需要暂停当前进程并进行其它操作时特别有用。

3、查看后台程序:

[root@justin ~]# jobs -l
[1]+  4299 停止 (tty 输出)     top
[root@justin ~]#

4、将后台程序调入前台运行:fg 任务编号

[root@justin ~]# fg 1

5、终止进程

ctrl+c:当命令在前台执行过程中需要停止该进程可以直接按住该组合键

kill:当程序在后台运行我们只需要知道该进程的PID就可以终止该进

HUP (1)、KILL (9)、TERM (15)分别代表著重跑, 砍掉, 结束; 详细的信号可以用 kill -l

[root@justin ~]# jobs -l
[1]+  4436 停止 (信号)         top
[root@justin ~]# kill -9 4436
[root@justin ~]# jobs -l
[1]+  4436 已杀死               top
[root@justin ~]#

服务管理

1、serveice

过service命令可以查看(status)、启动(start)、停止(stop)或者重启(restart)服务

[root@justin ~]# service httpd status
httpd is stopped
[root@justin ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for justin
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@justin ~]# service httpd stop
Stopping httpd:                                            [  OK  ]
[root@justin ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for justin
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@justin ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for justin
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@justin ~]#

2、chkconfig

chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

133846496.png

[root@justin ~]# chkconfig --list httpd
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@justin ~]# chkconfig --add httpd
[root@justin ~]# chkconfig httpd on
[root@justin ~]# chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@justin ~]# chkconfig --level 24 httpd off
[root@justin ~]# chkconfig --list httpd
httpd           0:off   1:off   2:off   3:on    4:off   5:on    6:off
[root@justin ~]#

1、如果添加服务时候提示:service httpd does not support chkconfig;可在#!/bin/bash 之后,添加以下两行

# chkconfig: 2345 10 90 

# description: httpd server ....

注意:chkconfig description后面有冒号,不能省略,否则也会报以上错误

其中2345是默认启动级别,级别有0-6共7个级别。

  等级0表示:表示关机   

  等级1表示:单用户模式   

  等级2表示:无网络连接的多用户命令行模式   

  等级3表示:有网络连接的多用户命令行模式   

  等级4表示:不可用   

  等级5表示:带图形界面的多用户模式   

  等级6表示:重新启动

10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。


2、如果使用服务时候提示:Warning: redis.service changed on disk. Run 'systemctl daemon-reload' to reload units.;可运行systemctl daemon-reload

[root@localhost app]# systemctl stop redis.service 
Warning: redis.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[root@localhost app]# systemctl daemon-reload
[root@localhost app]# systemctl stop redis.service 
[root@localhost app]#



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值