Linux进程和计划任务

                                                      Linux进程和计划任务

本章内容:

进程相关概念

进程及系统相关工具

计划任务

 

进程概念:

内核功能:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等;

process:在内存中运行的程序被称为进程。

task structLinux内核存储进程信息的数据结构格式

task list:多个任务的task list组成的链表

进程的创建:

      centos56中的第一个进程为:init

       进程:都有其父进程创建,COW(写时复制)

 

进程优先级:

系统优先级:数字越小,优先级越高

     0–139:(centos4,5

     0–99 :(centos6

实时优先级:99–0:数值越大优先级越高

nice值:-20–19:对应的系统优先级100-13999

 

进程内存:

     page frame:页框,用存储页面数据,存储page 4k

     LRU:近期最少使用算法,释放内存

     MMU:内存管理单元,负责转换线性和物理地址

 

Linux内核:抢占式多任务

进程类型:

     守护进程:daemon,在系统引导过程中启动的进程,和终端无关的进程。

     前台进程:跟终端相关,通过终端启动的进程。

     注意:两者可以相互转化。

 

进程状态:

运行态:running

就绪态:ready

睡眠态:

     可中断:interruptable

     不可中断:uninterruptable

停止态:stopped,暂停于内存中,但不会被调度,除非手动启动。

僵死态:zombie,结束进程,父进程结束前,子进程不关闭。

 

系统管理工具:

进程的分类:

  CPU-boundCPU密集型,非交互。

  IO-BoundIO密集型,交互。

 

Linux系统状态的查看及管理工具:

     pstreepspidofpgreptophtopglancepmapvmstatdstatkillpkilljobbgfgnohup

 

pstree命令:查看进程树

      pstree  [options]

               -p:可以列出对应进程的PID号;

               -u:列出进程对应的用户名;

               -a:列出完整的命令信息;

 

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

     ps [options]

         a:显示当前终端下的所有进程信息;

         u:使用以用户为主的格式输出进程信息;

         x:显示当前用户在所有终端下的进程信息;

        -e:显示系统内的所有进程信息;

        -l:使用长格式显示进程信息;

        -f:使用完整的格式显示进程信息;

   执行ps aux”命令后,将以列表的形式输出所有进程信息,其中各字段的含义如下

        USER:启动该进程的用户账号的名称。

        PID:该进程在系统中的PID号,在当前系统时唯一的。

        TTY:表明该进程在哪个终端上运行,“?”表示未知或不需要的终端。

        STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)l(多线程进程)T(停止状态)D(不可中断休眠)对于僵死状态的进程应该手动终止掉。

        START:启动该进程的时间。

        TIME:该进程占用CPU的时间。

        COMMAND:启动该进程的命令的名称。

        %CPUCPU占用百分比。

        %MEM:内存占用百分比。

        VSZ:占用虚拟内存(swap空间)的大小。

        RSS:占用常驻内存(物理内存)的大小。

 

搜索进程:

      pgrep命令:查询特定进程信息的专用工具。

         pgrep   [options]  patter

                   -u:真正运行命令生效的用户

                   -U:真正发起运行命令的用户

                   -t:与指定终端相关的进程

                   -l:显示进程名

                   -a:显示完整格式的进程名

                   -p:显示父进程为此指定的进程的进程列表

        示例:

         [root@centos6 proc]# pgrep -l  bash

         4128 bash

         6761 bash

         6780 bash

         [root@centos6 proc]#

 

pidof命令:查询指定进程的pid号。

示例:

  [root@centos6 proc]# pidof bash

  6780 6761 4128

  [root@centos6 proc]#

 

uptime命令:查看系统的平均负载

      显示当前系统时间,系统已经启动多久,当前登录系统的人数,系统的平均负载(1210分钟的平均负载,一般不会超过1

  系统平均负载:

      指在特定时间间隔内运行队列中的平均进程数。

      如果每个cpu内核的当前活动进程数不大于3的话,那么系统性能良好。如果每个CPU内核的任务大于5,那么这台机器的性能有严重的问题。

      如果Linux主机是1个双内核CPU的话,当load average6的时候说明机器已经被充分使用了。  

      示例:

        [root@centos6 Desktop]# uptime

        10:49:46 up 25 min,  2 users,  load average: 0.14, 0.10, 0.18

        [root@centos6 Desktop]#      (平均负载)

 

top命令:进程管理工具,有许多内置的命令

      选项:

          -d#:指定刷新时间间隔,默认为3

          -b:以批次方式显示

          -n#:显示多少批次

 

      排序:

        P:以占据的cpu百分比,%CPU进行排序;

        M:占据内存百分比,%MEM进行排序;

        T:累计占据CPU的时长进行排序;

       

       首部信息显示:

        uptime信息 :按l 键可以“屏蔽/显示” uptime平均负载

        tasksCPU信息:按 t 键可以“屏蔽/显示”tasksCPU信息

        CPU分别显示:按 1(数字)可以把所有CPU单个显示

        memory信息:按 m 键可以“屏蔽/显示”内存和swap的信息

退出top命令:q

修改刷新时间间隔: s键 后跟上要间隔的刷新时间(以秒为单位)

终止指定的进程:k

保存文件:W

 

栏位信息简介:

    us:用户空间

    sy:内核空间

    ni:调整nice时间

    id:空闲

    wa:等待IO时间

    hi:硬中断

    si:软中断

    st:被虚拟机偷走的时间

 

htop命令:进程管理工具,需从Fedora-EPEL源安装

     选项:

        -d#:指定延迟时间

        -u:仅显示指定用户的进程

        -s:以指定字段进行排序

 

vmstat命令:显示虚拟内存信息

     vmstat  [options]  [delay[count]]

              -s:显示内存的统计数据

示例: 每秒刷新一次,显示5

 [root@centos6 Desktop]# vmstat 1 5

procs ———–memory———- —swap– —–io—- –system– —–cpu—–

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

 1  0     0 270616  70172 278980    0    0    12     1   47   66  0  0 99  1  

 0  0     0 270536  70172 279012    0    0     0     0  109  131  1  0 100  0  0

 0  0     0 270536  70172 279012    0    0     0     0  110  148  1  1 99  0  0

 0  0     0 270536  70172 279012    0    0     0     0   93  118  1  0 100  0  0

 0  0     0 270536  70172 279012    0    0     0     0   96  133  0  0 100  0

[root@centos6 Desktop]#

 

pmap命令:查看进程的内存映射

pmap  [options] pid

         -x:显示详细格式的信息

另一种查看方式是:

 #cat  /proc/PID/maps

示例:

[root@centos6 Desktop]# pgrep bash

3290

[root@centos6 Desktop]# pmap -x 3290

3290:   /bin/bash

Address           Kbytes     RSS   Dirty Mode   Mapping

0000000000400000     852     536       0 r-x–  bash

00000000006d4000      36      36      36 rw—  bash

00000000006dd000      24      24      24 rw—    [ anon ]

00000000008dc000      36       8       0 rw—  bash

0000000001f5a000     264     248     248 rw—    [ anon ]

0000003f24400000     128     112       0 r-x–  ld-2.12.so

…………………………………………………………………………….

[root@centos6 Desktop]#

 

glances命令:系统监控工具 (需要从EPEL源安装)

     示例:

     [root@centos6 Desktop]# glances

     C/S模式下运行glances 可以实现远程监控其他主机,适用于局域网内;

     服务器端设置:

        glances  -s  -B IPADDR

                -s:指明是服务器端

                -B:绑定要监控的服务器的IP地址

     客户端模式:

        glances  -c  IPADDR

                -c:指明是客户端

           IPADDR:指明要监控的服务端地址

 

     示例:

      测试环境说明:

       centos 7 为服务器端,IP地址为:192.168.3.10

       centos 6 为客户机端,IP地址为:192.168.3.2

 

      服务器模式配置:

        [root@centos7 Desktop]# glances  -s  -B 192.168.3.10

     

      客户机端模式端,监控centos7

        [root@centos7 Desktop]# glances  -c   192.168.3.10

 

dstat命令:系统资源统计

       dstat [-afv] [options..] [delay [count]]

                 -c:显示CPU相关的信息

                 -d:显示disk相关的信息

                 -g:显示page相关的统计数据

                 -m:显示memory相关的统计数据

                 -n:显示network相关的统计信息

                 -p:显示process相关的统计数据

                 -r:显示IO请求相关的统计数据

                 -s:显示swapped相关的统计数据

           –top-cpu:显示最占cpu的进程

           –top-io:显示最占用io的进程

           –top-mem:显示最占用内存的进程

           –top-latency:显示延迟最大的进程

 

     示例:每隔1秒统计一次,一共统计5

     [root@centos6 Desktop]# dstat 1 5

     —-total-cpu-usage—- -dsk/total- -net/total- —paging– —system–

     usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw

     0   0  99   1   0   0|  25k 1837B|   0     0 |   0     0 |  93   132

     0   0 100   0   0   0|   0     0 |   0     0 |   0     0 |  87   123

     1   1  99   0   0   0|   0     0 |   0     0 |   0     0 | 127   143

     2   1  97   0   0   0|   0     0 |   0     0 |   0     0 | 179   183

     1   2  97   0   0   0|   0     0 |   0     0 |   0     0 | 149   148

     1   1  98   0   0   0|   0     0 |   0     0 |   0     0 | 112   124

[root@centos6 Desktop]#

 

killkillallpkill命令:终止进程

   kill命令向进程发送控制信号,以实现对进程的管理

   显示当前系统可用信号:kill -l

       常用信号:

        1SIGHUP:无需关闭进程而让其重读配置文件;

        2SIGINT:终止正在运行的进程,相当于ctrl+c

        9SIGKILL:杀死正在运行的进程;

       15SIGTERM:终止正在运行的进程;

       18SIGCONT:继续运行

       19SIGSTOP:后台休眠

      指定信号的方法:

         1)信号数字识别:1,2,3….

         2)信号的完整名称:SIGHUP

         3)信号的简写名称:HUP

 

 kill命令:

     使用kill命令终止进程时,需要使用进程的PID号作为参数;无特定选项信号时,kill命令将给该进程发送终止信号并正常退出,若该进程已经无法响应终止信号,则可以结合“-9”选项强行杀死进程。

       示例:

       [root@centos6 ~]# pgrep  -l  vim

       5031 vim

       [root@centos6 ~]# kill 5031

       [root@centos6 ~]# pgrep  -l  vim

       [root@centos6 ~]#

 

killall命令:

     使用killall命令可以通过进程名来杀死进程,当需要结束系统中多个相同名称的进程时,使用killall命令将更加方便,效率更高。killall命令也同样可以结合“-9”选项以强制结束进程。

     示例:

     [root@centos6 ~]# vim f1

 

     [1]+  Stopped                 vim f1    //crtl+z挂起至后台

     [root@centos6 ~]# pgrep -l vim

     5297 vim

     [root@centos6 ~]# killall -9 vim

     [root@centos6 ~]# pgrep -l vim

     [1]+  Killed                  vim f1    //已杀死vim进程

     [root@centos6 ~]#

 

pkill命令:

使用pkill命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,如“-U”指定用户,“-t”指定终端等。

示例:

 1)终止用户zheng所在的终端:使用选项“-t

    [root@centos6 ~]# who

zheng    tty2         2016-09-17 19:28

root     tty1         2016-09-17 10:25 (:0)

root     pts/1        2016-09-17 17:36 (:0.0)

[root@centos6 ~]# pkill -9 -t tty2

[root@centos6 ~]# who

root     tty1         2016-09-17 10:25 (:0)

root     pts/1        2016-09-17 17:36 (:0.0)

[root@centos6 ~]#

2)终止用户zheng所在的终端:使用选项“-U

   [root@centos6 ~]# who

   zheng    tty2         2016-09-17 19:32

   root     tty1         2016-09-17 10:25 (:0)

   root     pts/1        2016-09-17 17:36 (:0.0)

   [root@centos6 ~]# pkill -9 -U zheng

   [root@centos6 ~]# who

   root     tty1         2016-09-17 10:25 (:0)

   root     pts/1        2016-09-17 17:36 (:0.0)

   [root@centos6 ~]#

 

Linux的作业控制:

     前台作业:通过终端启动,且启动后一直占据终端;

     后台作业:可以通过终端启动,但启动后即转入后台运行

     如何让作业运行与后台?

     1)运行中的作业可以执行:ctrl+z

     2)未启动的作业可以执行:#command &

      以上此类后台作业虽然被送往后台运行,但其依然与终端相关,退出终端,将关闭后台作业,如果希望送往后台后剥离与终端的关系可以执行以下命令:

      #nohup command &     #screen;command

      示例: 使用nohup命令剥离后台命令ping与终端的关系,即使断网也会继续运行。

       [root@centos6 ~]# nohup ping 127.0.0.1 &

       [1] 5886

       [root@centos6 ~]# nohup: ignoring input and appending output to `nohup.out'

 

     jobs命令:查看所有与终端相关的后台运行的作业

         jobs  -l  :查看所有后台运行的作业;

       示例:

         [root@centos6 ~]# vim f1 &

         [1] 5905

         [root@centos6 ~]# jobs -l  //查看所有后台运行的作业;

         [1]+  5905 Stopped (tty output)    vim f1

         [root@centos6 ~]#

 

     fg命令:可以将后台的进程任务重新调入终端前台执行;只需指定后台任务对应的顺序编号,可以通过jobs命令获取。

        示例:将后台的vim f1调到前台工作

         [root@centos6 ~]# jobs -l

         [1]+  5905 Stopped (tty output)    vim f1

         [root@centos6 ~]# fg 1

 

     bg命令:让送往后台的作业在后台继续运行;

         示例:

         [root@centos6 ~]# ping 127.0.0.1

         PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

         64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.046 ms

         64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.041 ms

         64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.054 ms

         ^Z                    //ctrl+z 调到后台

         [2]+  Stopped                 ping 127.0.0.1

         [root@centos6 ~]# bg 2   //把在后台停止的ping在后台运行起来

         [2]+ ping 127.0.0.1 &

         64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.127 ms

         [root@centos6 ~]# 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.055 ms

 

并行运行:

      让两个或多个脚本同时运行,需写脚本的绝对路径,后必须加&”符。

      示例:

      编写3个循环脚本

        [root@centos6 testdir]# cat f1.sh f2.sh f2.sh

        #!/bin/bash

        while true;do

        echo "f1.sh"

        sleep 1

        done

        #!/bin/bash

        while true;do

        echo "f2.sh"

        sleep 1

        done

        #!/bin/bash

        while true;do

        echo "f2.sh"

        sleep 1

        done

        [root@centos6 testdir]#

   第一种并行运行脚本方法:

        [root@centos6 testdir]# (/testdir/f1.sh&);(/testdir/f2.sh&);(/testdir/f3.sh&)

   

   第二种并行运行脚本方法:

        [root@centos6 testdir]{ /testdir/f1.sh&/testdir/f2.sh&/testdirf3.sh& }

   

   第三种并行运行脚本方法:

        编写一个脚本,把f1f2f3脚本放进去。

        [root@centos6 testdir]# cat all.sh

        #!/bin/bash

        #

        /testdir/f1.sh&

        /testdir/f2.sh&

        /testdir/f3.sh&

        [root@centos6 testdir

      执行all.sh脚本并行处理f1f2f3脚本

        [root@centos6 testdir]# source all.sh

 

nice命令:调整进程优先级

       示例:

        [root@centos6 testdir]# nice -n -10 ping 127.0.0.1

       查看设定的优先级:

        [root@centos6 testdir]# ps axo  pid,comm,ni

 

renice命令:重新设定进程优先级

        renice   [-n]  priority   pid

 

计划任务管理:

     Linux系统中,通过atdcrond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过atcrontab命令进行计划任务的设定。

     使用at命令设置的计划任务只在指定的时间点执行一次,有一个前提是,对应的系统服务at必须运行。

     使用crontab命令设置的计划任务可以按预设的周期重复执行,可以大大减轻重复设置系统管理任务的操作。有一个前提是,对应的系统服务crond必须运行。

 

     at 命令:

      at  [options]  TIME

        常用选项:

            -q:队列

            -l:查看当前系统中设置的at计划任务列表,相当于atq

            -d:删除指定任务编号的作业,相当于atrm

            -c:查看具体的作业任务。

            -f:从指定的脚本文件中读取任务

            -m:强制at发邮件表示执行完毕

        TIME

            HH:MM  [yyyy-mm-dd]

            noon  midnight  teattime

            tomorrow

            now+#{minutes  hours  days weeks}

 

            ctrl+d:提交一次性计划任务

 

at一次性计划任务:

 

          执行方式:

             1)交互式  2)输入重定向  3at  -f  scriptsfile

          依赖atd服务,需要启动才能实现at一次性计划任务

          at队列存放在/var/spool/at目录中

          /etc/at.{allow ,deny}控制用户是否能执行at任务

            白名单:/etc/at.allow默认不存在,只有该文件中的用户才能执行at命令

            黑名单:/etc/at.deny拒绝该文件中的用户执行at命令,而没有在at.deny文件中的用户可以执行at命令。

           如果两个文件都不存在,则只有root可以执行at命令。

 

       at命令:执行的一次性计划任务是存放在/var/spool/at目录下的

           示例:

             [root@centos6 at]# at 15:22

             at> wall hello

             at> <EOT>

             job 6 at 2016-09-18 15:22

             [root@centos6 at]# pwd

             /var/spool/at

             [root@centos6 at]# ls

             a000060176e77a  spool

             [root@centos6 at]#

        at命令的“-f”选项:从指定的脚本文件中读取任务。

           示例:

            [root@centos7 testdir]# cat sum100.sh

            #!/bin/bash

            echo "==============================="

            i=1

            sum=0

           while [ $i -le 100  ];do

           let  sum=$sum+$i

           let i++

           done

           echo "1 to 100 sum :$sum"

           echo "=============================="

           unset i

           unset sum

           [root@centos7 testdir]#

           [root@centos7 ~]# at 3:45 -f /testdir/sum100.sh

           job 3 at Sun Sep 18 03:45:00 2016

           [root@centos7 ~]#

        注: at的执行结果需去mail邮件中查看。

 

     注意:作业执行命令的结果中的“标准输出”和“错误输出”以邮件通知给相关用户。

    

       示例:

          [root@centos7 ~]# at 3:05

          at> wall da jia hao

          at> echo at test

          at> <EOT>                   //ctrl+d提交计划任务

          job 2 at Sun Sep 18 03:05:00 2016

          [root@centos7 ~]# at -l

          2 Sun Sep 18 03:05:00 2016 a root

          [root@centos7 ~]#

          Broadcast message from root@centos7 (Sun Sep 18 03:05:01 2016):

 

          da jia hao

 

        You have new mail in /var/mail/root //echo执行的结果是标准输出,所以有邮件通知

        [root@centos7 ~]#

 

crontab周期性计划任务

        使用crontab命令设置的计划任务可以按预设的周期重复执行,可以大大减轻重复设置系统管理任务的操作。有一个前提是,对应的系统服务crond必须运行。

               centos7systemctl   status  crond

               centos6service    crond    status

        周期性计划任务提交给crond,到指定的时间会自动运行。

          系统crond任务:系统维护计划任务

                /etc/crontab

          用户crond任务:

                crontab命令

          日志:/var/log/cron

     用户自行定义的cron任务将被保存在目录“/var/spool/cron”中,文件名与对应的用户账号同名。

 

用户crontab周期性计划任务

crontab命令定义,每个用户都有专用的cron任务文件:

    /var/spool/cron/USERNAME

 

crontab命令语法:

    crontab  [options]

             -u:仅root可以运行,指定用户管理cron任务;

             -e:编辑计划任务;

             -r:删除计划任务;

             -l:显示计划任务列表;

             -i:同“-r”一同使用,已交互模式移除指定的计划任务;

 

  crontab计划任务时间表示法:

       1)特定值:给定时间点有效取值范围内的值

       2*:表示“每”

       3)离散值:###  例如:1,3,5,9

       4)连续值:#-#  例如:2-6

       5)在指定的时间范围上,定义步长 /#:#即为步长,例如:*/5

 

  时间格式:

        @reboot    run once after reboot

        @yearly     0 0 1 1 *

        @annually   0 0 1 1 *

        @monthly   0 0 1 * *

        @weekly    0 0 * * 0

        @daily      0 0 * * *

        @hourly    0 * * * *

 

sleep命令:

        sleep  NUMBER [SUFFIX]…

             SUFFIX

                s:秒,默认

               m:分

               h:小时

               d:天

        usleep:微秒;

注意:

运行结果的标准输出和错误输出以邮件通知给相关的用户。

    command  >  /dev/null

    command  &> /dev/null

对于cron任务来说,%有特殊的用途;如果在命令中要使用%,则需要转义,不过,如果把%放置在单引号中,也可以不用转义。

                

系统cron任务:/etc/crontab

   示例:晚上910分以zheng用户执行一个echo hello

      1 SHELL=/bin/bash

      2 PATH=/sbin:/bin:/usr/sbin:/usr/bin

      3 MAILTO=root

      4 HOME=/

      5

      6 # For details see man 4 crontabs

      7

      8 # Example of job definition:

      9 # .—————- minute (0 – 59)

     10 # |  .————- hour (0 – 23)

     11 # |  |  .———- day of month (1 – 31)

     12 # |  |  |  .——- month (1 – 12) OR jan,feb,mar,apr …

     13 # |  |  |  |  .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

     14 # |  |  |  |  |

     15 # *  *  *  *  * user-name command to be executed

        10  9  *  *  *   zheng   /bin/echo   “hello”

 

用户cron任务:crontab  -e

    [root@centos6 ~]# crontab -e

    22 20  * * *  /bin/echo "hello"

0  0   * * *  /sbin/shutdown  -h now

 

示例:执行用户计划任务,让其到点休眠1分钟,在执行wall

     [root@centos6 ~]# crontab -e

     16  21 * * * /bin/sleep 1m;/usr/bin/wall "hello"

 

 

  

      

 

 

 

 

       

 

    

     

 

     

 

 

 

 

 

 

 

 

 

 

 

 

原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/48353