Linux系统管理含进程后台管理定时任务

Linux系统管理课程包含进程管理、后台管理、系统资源查看、系统定时任务(后面还有专门的章节介绍),该课程是整个Linux课程中的一环,也是很重要的课程之一。本课程同样来源于Tony老师2017年视频笔记。

一、进程管理
⑴、进程管理简介
    ①、进程:是正在执行的程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
        注释:部分进程运行时间很短,进程运行都在内存中,部分服务常驻在内存,阿帕奇程序在内存中最基本服务有6个,每有一个客户端访问就产生一个新进程,阿帕奇默认同时产生的进程为400个,最大为2048个,即一个程序可能产生多个进程。
    ②、进程管理的作用:
         判断服务器健康状态(最重要)
         查看系统中所有的进程
         杀死进程
⑵、进程的查看-ps命令和pstree命令
    ①、查看所有进程
        ps aux           #查看系统中所有进程,使用BSD操作系统格式
        ps -le           #查看系统中所有进程,使用Linux标准命令格式
           选项
           a             #显示一个终端的所有进程,除了会话引线
           u             #显示进程的归属用户及内存的使用情况
           x             #显示没有控制终端的进程
           -l            #长格式显示。显示详细信息
           -e            #显示所有进程,和-A作用一致
    ②、ps命令的输出结果解释
        USER: 该进程是由哪个用户产生的
        PID:  进程的ID号
        %CPU: 该进程占用CPU的百分比
        %MEM: 该进程占用物理内存的百分比
        VSZ:  该进程占用虚拟内存的大小,单位KB
        RSS:  该进程占用实际物理内存的大小,单位KB
        TTY:  该进程是在那个终端运行的。其中tty1-tty7代表本地控制台终端(本地终端),tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端(远程终端,Linux更新的2.6内核以后可以达到65535个远程终端)。
        STAT:进程状态。常见的状态有:
              R: 运行
              S: 睡眠(可中断的睡眠状态)
              T: 停止状态
              s: 包含子进程
              +: 位于后台
              Z:退出状态,僵尸进程
              X:退出状态,进程即将被销毁(永远看不见)
              D: 不可中断的睡眠状态
              N:低优先权
        START: 该进程的启动时间
        TIME:  该进程占用CPU的运算时间,就是过程占用时间
        COMMAND:产生此进程的命令名(这个是最重要的查看点)
        注释:/sbin/init 的PID永远为 1,是所有进程的父进程;TTY 位置为?号证明不是终端启动的,而是系统的内核直接启动的,是系统进程。
    ③、查看进程树
        pstree [选项]
                -p         #显示进程的PID
                -u         #显示进程的所属用户
        查看起来更直观,重复进程会数字*进程表示
⑶、进程的查看-top命令(执行了top命令,是可以再输入交互命令的)
 查看系统健康状态:top [选项]  #注意下面标准的(重要查看点)
                         -d     #指定top命令每隔几秒更新,默认是3秒
                         -b     #使用批处理模式输出。一般和"-n"合用
                         -n     #指定top命令执行的次数,一般和"-b"合用
                                 -n 后面加次数(-b后面也是加秒数?待确认)
    在top命令的交互模式中可执行的命令:
                         ?或h:  #显示交互模式的帮助
                         P:      #以CPU的使用率排序,该项默认
                         M:      #以内存的使用频率排序
                         N:      #以PID排序
                    任意键:     #按任意键继续
                         q:      #退出top
      注释:top命令是比较耗费资源的命令,默认3秒刷新是比较合理的,不需要更改,Windows中的进程管理界面也是比较耗费资源的;top -b -n 1 > /root/top.log   将3秒刷新1次的top结果重定向写入top.log日志,打开日志可以看到详细情况。
 top命令执行后显示结果解释(主要是前面5行,第6行是交互输入框)
   第一行:为任务队列信息
          内容              说明:
          12:26:45          系统当前时间
          up 1 day, 13:32   系统的运行时间,本机已经运行1天13小时32分
          2 users           当前登陆了2个用户
          load average:0.00 系统在1分钟,5分钟,15分钟的平均负载
              , 0.00, 0.00      一般认为小于1时,负载较小,大于1超出负荷
                                ,双核不大于2;4核不大于4;以此类推,当然这
                                和服务器运行经验有关,假如4核大于4但其他指标均
                                正常,就证明大于4也可以,平常注意下积累经验数值
                                (比较重要,是查看点)
       注释:系统运行时间虽然越长越好,代表服务器稳定没有故障,但是不能舍本求末,因为时间越长,服务器系统的缓存、临时文件会越多,会导致服务器卡顿。讲师建议:游戏、电影、下载服务器一周定时重启一次;网站等低压力的服务器一般一个月重启一次
       第二行:为进程信息
               内容              说明
               Tasks:95 total    系统中的进程总数
               1 running         正在运行的进程数
               94 sleeping       休眠的进程
               0 stopped         正在停止的进程
               0 zombie          僵尸进程,如果不是0,需要手工检查
 
       注释:僵尸进程:上下进程之一的进程出现异常停止,上下进程均不能正确停止,卡在那里。当发现有僵尸进程时,等1分钟左右再查看是否存在,如果还存在百度一下该进程重要程度,不重要的话结束该进程,重要的话没解答。。。
       第三行:CPU信息
               内容               说明
               Cpu(s): 0.1%us     用户模式占用的CPU百分比
               0.1%sy             系统模式占用的CPU百分比
               0.0%ni             改变过优先级的用户进程占用的CPU百分比
               99.7%id            空闲CPU的百分比(重要查看点)
               0.1%wa             等待输入/输出的进程  占用的CPU 百分比
               0.0%hi             硬中断请求服务占用的CPU百分比
               0.1%si             软中断请求服务占用的CPU百分比
               0.0%st             st(Steal time)虚拟时间百分比。就是当有虚拟机
                                  时,虚拟CUP等待实际CPU的时间百分比
 
        注释:空闲CPU的百分比不能低于20%,否则证明系统非常卡,服务器压力非常大
        第四行:内存信息(分别为整体内存大小、多少已用、多少空闲、多少缓冲)
        第五行:交换分区(分别为交换分区大小、多少已用、多少空闲、多少缓存已用)
        注释:buffers(缓冲)作用:加速的数据写入
              cached(缓存)作用:加速的数据读取
              内存空闲(重要查看点),如果交换分区空闲低,可以手动添加
⑷、杀死进程(在正常关闭不起作用后才考虑使用)
    ①、kill命令:   kill -l        #查看可用的进程信号,共有64个信号
        kill [信号] [进程ID]       #语法
    信号代号  信号名称  说明
     1        SIGHUP     该信号让进程立即关闭,然后重新读取配置文件后重启
     2        SIGINT     程序终止信号,用于终止前台进程。相当于ctrl+c
     8        SIGFPE     在发生致命的算术运算错误时发出,不仅包括浮点运算
                         错误,还包括溢出及除数为0等其他所有算术的错误
     9        SIGKILL    用来立即结束程序的运行,信号不能被阻塞、处理和忽略
                         一般用于强制性终止进程
     14       SIGALRM    时钟定时信号,计算的是实际的实际或时钟时间,alarm
                         函数使用该信号
     15       SIGTERM    正常结束进程的信号,kill命令的默认信号。有时如果进
                         程已经发生问题,这个信号是无法正常终止进程的,我们
                         才会尝试SIGKILL信号,也就上信号9
     18       SIGCONT    该信号可以让暂停的进程恢复执行,本信号不能被阻断
     19       SIGSTOP    暂停前台进程,相当于ctrl+z ,信号不能被阻断。
     例如:kill -1 2235        #重启进程,
           kill -9 2236        #强制杀死进程
     注释:信号1相当于平滑重启,重新加载配置文件,不会影响用户体验
    ②、killall命令:killall [选项] [信号] 进程名    #按照进程名杀死进程
                              -i             #交互式,询问是否要杀死某个进程
                              -I             #忽略进程名的大小写
        例如:killall -9 httpd               #杀死阿帕奇进程
    ③、pkill 命令:pkill [选项] [信号] 进程名   #按照进程名终止进程
                           -t 终端号:按照终端号踢出用户
       查看当前登陆用户的命令:w
       可以看出当前登陆的用户、IP、依靠最后执行的命令w可判断哪个root是自己
       按照终端号来踢出用户:pkill -9 -t tty1
                             pkill -9 -t pts/1
        注释:只有root用户可以踢出其他用户,如果两个都是root,先下手为强
⑸、修改进程优先级(CPU速度太快,一般不需要改,应用于内核裁剪和嵌入式开发)
    ①、简介:Linux是多用户、多任务的系统,运行着非常多的进程,然而每个CPU在同一个时钟周期內只能运算一个指令,进程优先级决定了每个进程处理的先后顺序。
        ps -le | more   分屏查看进程可以看到PRI  NI
        PRI代表Priority(初始值为80),NI代表Nice (初始值为0),这俩个值都是优先级,数字越小代表该进程优先级越高
    ②、修改NI值的注意事项
         root用户NI的范围是-20至19  且能设定所有用户的NI值
         普通用户调整NI值的范围是0至19,只能调整自己的进程,且只能调高
         PRI(最终值)=PRI(原始值)+NI    用户只能修改NI,不能直接修改PRI
    ③、nice命令:  nice [选项] 命令
                          -n NI值               #给命令赋予NI值
       #只能给新执行的命令直接赋予NI值,不能修改已经存在的进程的NI值
       例如: nice -n -5 service httpd start
    ④、renice命令:renice [优先级] PID
        #修改已经存在进程的NI值命令,而且是某一个
        例如:renice -10 2125
 
二、工作管理(也称后台管理;Windows最小化程序就是放入后台,方便操作其他程序)
⑴、工作管理简介:指在单个登陆终端中(也就是登陆shell界面中)同时管理多个工作的行为。Linux中将程序放入后台也是为了方便操作其他程序,不放入后台无法操作别的。
    注意事项:
     当前登陆的终端只能管理当前的工作,而不能管理他处登陆的终端
     放入后台的命令是可以持续运行的命令,否则无意义
     放入后台执行的命令如果和前台用户有交互(包括给用户查看的)或者需要前
       台输入,则只是暂停,而不能继续执行
⑵、工作管理方法
    ①、把进程放入后台
        在命令后面加 & 符号;或者执行某个命令后,按ctrl+z 放在后台暂停
        例如:tar -zcf etc.tar.gz /etc &         top   然后按 ctrl+z
    ②、查看放入后台的进程
        jobs [-l]             -l  #显示工作的PID
        #+号代表最近放入后台的进程,也是恢复时默认恢复的进程;-号代表倒数第二个放入后台的工作,在③④命令后面默认不加工作号后放回后台,+ - 顺序会变。而且工作号也会有变动,具体的可以实际操作一下。
        注释:进程放入后台状态有停止、运行、完成;完成后进程就会消失。
    ③、将后台进程恢复到前台(fg不加工作号默认将有+号的进程恢复到运行)
        fg %工作号
        %工作号:%号可以省略,但是注意与PID的区别
    ④、将恢复到前台的工作再放入后台(bg不加工作号默认将+号的进程恢复到运行)
        bg %工作号
        注意:后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台
⑶、后台命令脱离登陆终端执行
   (除了MySQL程序自身优化过关闭终端会继续自动运行,其他程序关闭终端会停止)
    简介:把命令放入后台,只能在当前登陆终端执行。一旦退出或关闭终端,后台程序会停止运行。(即无论是正确logout还是直接关掉,都会向系统发生1) SIGHUP信号)
    方法:
     把需要执行的命令加入/etc/rc.local文件(自定义启动配置文件,最简单)
     使用系统定时任务,定时执行后台命令(会偶尔失效)
     使用nohup命令(标准方法)
       nohup [命令] &
       例子:创建一个脚本程序放入后台执行(先创建文件,输入脚本,然后nohup)
            vi for.sh
            #!/bin/bash
            for((i=0;i<=1000;i=i+i))
               do
                 echo 11 >> /root/for.log
                 sleep 10s
               done
             nohup /root/for.sh &
 
三、系统资源查看(下面前三个命令需要背下来)
⑴、vmstat 命令监控系统资源
    vmstat [刷新延时 刷新次数]     例如:vmstat 1 3
    显示结果分析:
     procs:进程信息字段
    r:等待运行的进程数,数量越大,系统越繁忙
    b:不可被唤醒的进程数量,数量越大,系统越繁忙
     memory:内存信息字段(下面单位均为KB)
    sapd:虚拟内存的使用情况
    free:空闲的内存容量
    buff:缓冲的内存容量
    cache:缓存的内存容量
     swap:交换分区的信息字段
       si:从磁盘中交换到内存中数据的数量,单位KB
       so:从内存中交换到磁盘的数据的数量,单位KB。
       这两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差
     io:磁盘读写信息字段
       bi:从块设备读入数据的总量,单位是块。
       bo:写到块设备的数据的总量,单位是块。
       这两个数字越大,代表系统的I/O越繁忙。
     system:系统信息字段
       in:每秒被中断的进程次数
       cs:每秒种进行的时间切换次数
       这两个数字越大,代表系统与接口设备的通信非常繁忙
     CPU:CPU信息字段
       us:非内核进程消耗CPU运算的时间的百分比
       sy:内核进程消耗CPU运算时间的百分比
       id:空闲CPU的百分比
       wa:等待I/O所消耗的CPU百分比
       st:被虚拟机所盗用的CPU占比
    注释:缓存和缓冲的区别:缓存是用来加速数据从硬盘中“读取”的,而缓冲是用来加速数据“写入”硬盘的。运行速度比较:CPU(100G/秒)、内存(1G/秒)、硬盘(50M/秒),因此需要缓存和缓冲(两者都是内存中运行)加速整体电脑的效率。
 
⑵、dmesg开机时内核自检信息(Linux自检2次:硬件BIOS自检和系统内核自检)
    dmesg                       #内核所有的自检信息
    dmesg | grep CPU            #内核关于CPU的自检信息
⑶、free命令查看内存使用状态
    free [-b|-k|-m|-g]
          -b               以字节为单位显示
          -k               以KB为单位显示,默认情况显示单位
          -m               以MB为单位显示
          -g               以GB为单位显示
     结果显示分析:
      第一行:total  内存总数、used  已使用内存数、free 空闲的内存数量
        shared  多个进程共享的内存总数、 buffers   缓冲内存数量、cached
        缓存内存数量          默认单位KB
      第二行(下面的 + - 为符号加减,Mem为数字的意思):
        -/buffers/cache 行used值,相当于第一行的used-buffers-cached
                                    #这里得出的used值为系统已用的值   
        +/buffers/cache 行free值,相当于第一行的free+buffers+cached
                                    #这里得出的free值为系统空闲的值
      第三行(交换分区的使用情况,服务器系统中SWAP分配都比较大,主要是为了提高系统性能):
        total是swap的总数;used是已经使用的swap数量,free是空闲的swap
        数量。默认单位是KB
⑷、查看CPU信息: cat /proc/cupinfo
⑸、uptime命令
    uptime            #显示系统的启动时间和平均负载,也就是top命令的第一行
                       w命令也可以看到这个数据
⑹、查看系统与内核相关信息
    uname [选项]
           -a          #查看系统所有相关信息(下面2个参数没什么意义)
           -r          #查看内核版本
           -s          #查看内核名称
    判断当前系统的位数  file /bin/ls     #随便找个命令查看
    2.6.32-279.e16.i686           是内核版本  用命令uname -r查看
    CentOS release 6.3 (Final)    是发行版本用lsb_release -a查看
    注释:在64位的CPU里面是可以安装32位系统的
⑺、列出进程打开或使用的文件信息
    lsof [选项]           #列出进程调用或打开的文件信息
         -c 字符串        #只列出字符串开头的进程打开的文件
         -u 用户名        #只列出某个用户的进程打开的文件
         -p pid           #列出某个PID进程打开的文件
     例如:
     lsof | more          #查询系统中所有进程调用的文件(分屏显示)
     lsof /sbin/init      #查询文件被哪个进程调用(被查询文件为系统文件)
     lsof -c httpd        #查看httpd进程调用了哪些文件
     lsof -u root         #按照用户名,查询某个用户的进程调用的文件名
 
四、系统定时任务
⑴、at一次性定时任务
    ①、查询确定at安装,而且是启动状态:
        chkconfig --list | grep atd          #查询at服务是否安装
        service atd restrat                  #启动at服务
    ②、at的访问控制机制(默认只有黑名单,因为白名单人数实在太多。。。)
         如果系统中有/etc/at.allow文件,那么只有写入/etc/at.allow(白名单)文件中的用户可以使用at命令(优先级低的写入同一用户的/etc/at.deny文件会被忽略)
         如果系统中没有/etc/at.allow文件,只有/etc/at.deny文件,那么写入/etc/at.deny文件(黑名单)中的用户不能使用at命令。对root无效。
         如果系统中以上两个文件都不存在,那么只有root用户可以使用at命令
    ③、at命令
        at [选项] 时间     #最常用的是直接加时间,不加选项
            -m             #当at完成后无论是否命令有输出都通知执行at的用户
            -c 工作号      #显示该at工作的实际内容
         时间:                                  例如:
         HH:MM                                        02:30
         HH:MM YYYY-MM-DD                             02:30 2017-1-05
         HH:MM[am|pm] [month] [date]                  02:30 July 25
         HH:MM[am|pm] + [minutes|hours|days|weeks]    now + 5 minutes
    ④、实验例子1:
        at now + 2 minutes   #在两分钟之后执行hello.sh脚本,后面有提示符
        at> /root/hello.sh >> /root/hello.log     #按照提示符输入执行内容
        例子:完整的例子过程
        vi hello.sh                           #创建文件
           #!/bin/bash                        #shell编程
           echo "hello" >> /root/hello.log
           :wq
        chmod 755 hello.sh                    #赋予执行权限
        ./hello.sh                            #执行一次
        ls                                    #查看文件列表
        cat hello.log                         #打开文件
        at now + 5 minutes                    #5分钟之后执行
        at> /root/hello.sh                    #输入执行程序绝对路径
        atq                                   #查看定时执行的at任务
        at -c 1                               #查询工作号为1的定时任务详情
注释:如果退格键不能删除前面不需要的,使用ctrl+退格键删除,crtl+d保存退出
        例子2(重启任务最好还是由人工执行):
        at 02:00 2017-1-5             #在指定时间重启
        at> /bin/sync                 #数据同步,将内存中的数据转移到硬盘
        at> /sbin/shutdown -r now     #执行重启
 
⑵、crontab循环定时任务(和用户身份绑定,所以执行定时任务需要注意是否有权限)
    ①、确定crond服务是否安装与启动
        chkconfig crond on                #确定服务是否安装???待确认
        service crond restart             #重启crond服务
        chkconfig --list | grep cron      #查询是否安装开启crond服务
    ②、crond访问控制机制(默认只有黑名单)
         当系统中有/etc/cron.allow文件时,只有写入此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命令。同样如果由此文件,/etc/cron.deny文件会被忽略,/etc/cron.allow文件的优先级更高
         当系统中只有/etc/cron.deny文件时,则写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用crontab命令
    ③、用户的crontab设置
        crontab [选项]
                -e          #编辑当前用户的crontab定时任务
                -l          #查询crontab任务
                -r          #删除当前用户所有的crontab任务
        例如:crontab -e       #进入编辑界面,会打开VIM编辑你的工作
        定时任务格式:* * * * * 执行的任务(命令/脚本)
                     crontab的配置文件格式
                     * * * * * [用户名] COMMAND
                     ↓↓ ↓ ↓ ↓
                     ↓↓ ↓ ↓→→→星期0-7(一周当中的星期几,0或7表示星期天)
                     ↓↓ ↓→→→月份1-12(一年中的第几个月)
                     ↓↓→→→日起1-31(一个月当中的第几天)
                     ↓→→→小时0-23(一天当中的第几小时)
                     →→→分钟0-59(一小时中的第几分钟)
         特殊符号    含义
         *           代表任意时间
         ,           代表不连续的时间
         -           代表连续的时间范围
         */n         代表每隔n执行一次
         例如  0 0 1,15 * 1      每个月1号15号,每个月的礼拜一 都执行
               5 5 * * 2 /sbin/shutdown -r now    每周二重启一下服务器
               0 5 * * *         每天5点整(分位千万不要写错成*)
    ④、crontab注意事项
         六个选项都不能为空,必须填写,如果不确定使用*代替任意时间
         crontab定时任务最小有效时间是分钟,最大为月,特殊看后面一节课程
         定有时间时,日期和星期最好不要一起写,容易混乱
         定时任务中,不管是直接写命令,还是脚本中写命令,最好都用绝对路径
           因为path路径会有些不同,可能会导致不执行的后果
⑶、系统的crontab设置
    系统的定时任务(实际就是将定时任务写入配置文件)
        crontab -e  是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务。可是有些定时任务需要系统执行,这时我们就需要编辑  /etc/crontab  这个配置文件
        /etc/crontab  文件打开后显示解释
        SHELL=/bin/bash               #基于这个bash的命令执行脚本方式
        PATH=/sbin:/bin:/usr/sbin:/usr/bin     
        #定时任务的4个存放命令路径,每个用 :隔开,因为比系统定义的命令路径
        要少,所以最好用绝对路径去写,才不会导致有些不在这些目录下的命令不能
        定时执行       按这样的理解,这个PATH是否可以和系统命令一样定义,不
        就避免了出现不执行的情况吗?待确认!!!
        MAILTO=root                   #发送定时任务消息到root
        HOME=/                        #标识主目录在哪
        再下面就是注释,*****定义和上面说的相同,唯一不同的是要加定义的用户
        例如:5 5 * * * root /root/hello.sh
    注释:还有一种方法,也是推荐方法,把需要执行的定时脚本复制到
          /etc/cron.{daily,weekly,monthly}目录中的任意一个,下面会详细讲解     
⑷、anacron配置
(服务器关机、断电、故障等情况下服务器恢复重启后会自动检测cron.daily  cron.hourly   cron.monthly    cron.weekly  这4个目录里面的定时计划,而crontab -e 编辑的定时任务就不会执行)
①、定义:anacron 是用来保证系统因关机后重启错过的定时任务可以继续执行
②、anacron检测周期和工作原理
     anacron会使用一天,七天,一个月作为检测周期
     在系统的/var/spool/anacron/目录中存在cron.{daily,weekly,monthly}文件,用于记录上次执行cron的时间,用于后面的时间比较
     和当前时间作比较,如果两个时间的差值超过了anacron的指定时间差值(daily时间差为1天,时间比较粗略,不会精确到小时,其他类推),证明有cron任务被错过执行
③、CentOS 6.x的区别
    在老的CentOS中,/etc/cron.{daily,weekly,monthly}这些目录会被cron调用,也会被anacron调用,容易重复执行
    在CentOS 6.x中则只会被anacron调用,避免了重复执行
    在CentOS 6.x中,anacron不再是服务,而是系统命令
④、anacron配置文件
    vi /etc/anacrontab
    RANDOM_DELAY=45              #最大随机延迟
    START_HOURS_RANGE=3-22       #anacron的执行时间范围是3:00-22:00
    1        5         cron.daily    nice run-parts /etc/cron.daily
    7        25        cron.weekly   nice run-parts /etc/cron.weekly
    @monthly 45        cron.monthly   nice  run-parts /etc/cron.monthly
   #天数 强制延迟(分)  工作名称       实际执行的命令(可查看nice命令)
   whereis run-parts    返回在 /usr/bin/run-parts
   vi /usr/bin/run-parts    
   #shell的一个脚本,相当于命令,效率较低一点点,而C#写的命令效率更高
⑤、以cron.daily为例子说明执行过程(假设服务器故障后重启)
    首先读取/var/spool/anacron/cron.daily中的上一次执行时间
    和当前时间比较,如果差值超过1天,就执行cron.daily工作
    执行这个工作只能在3:00-22:00之间(可根据上面内容进行更改)
    执行工作时强制延迟5分钟,再随机延迟0-45分钟(避免大量任务同时执行)
    使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily
      目录中的所有可执行文件
请按F5,刷新后再评论
  • 全部评论(0
    还没有评论,快来抢沙发吧!