Linux进程管理及计划任务

  • 进程

  进程相关概念

     进程Process:动态概念,运行中程序的一个副本,是被载入内存的一个指令集合;它有生命期

                    进程号(Process ID)PID:系统分置编号来标识各个进程

        UID、GID和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承

                 程序:静态概念,不运行时,存放在磁盘上

     进程创建

         Centos 6:init 第一个进程

         Centos 7:systemd 第一个进程

        进程都是父进程创建子进程:CoW,fork( ),clone( )方式

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

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

     Linux内核:抢占式多任务

     进程内存

         Page Frame:页框,用存储页面数据,存储Page 4k

         LRU:Least Recently Userd 近期最少使用算法

             物理地址和线性地址空间

             VSZ:Virtual memory Size 虚拟内存集,线性内存(承诺分配的内存空间)

             RSS:ReSident Size 常驻内存集(实际使用的内存空间)

         MMU:Memory Manager Unit 负责转换线性和物理地址

         TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存

     进程间通信IPC(Inter Process Communication)

           同一主机

                   signal:信号

                   shm shared memory:共享内存

                   semaphore:信号量,一种计数器

           不同主机

                  socket:IP和端口号

                   RPC:remote procedure call

                   MQ:消息队列,Kafka,ActiveMQ 

     进程的基本状态

          创建状态

          就绪状态

          执行状态

          阻塞状态

          终止状态   

     进程优先级

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

              0-139(centos4,5)

              0-98,99(centos7)

          实时优先级:值最大优先级最高

              99-0

          nice优先级:值越小,越优先

             -20~19

            对应系统系统优先级100-139或99

       调整优先级

            静态优先级:100-139

            进程默认启动时的nice值为0,只有root用户才能降低nice值(提高优先性)

         运行程序时指定优先级

           nice [OPTION] [COMMAND [ARG]...]

           nice -n -# command

        修改处于运行中的进程优先级

           renice [-n] priority pid...

            renice -n # pid

      Big O:时间复杂度,用时和规模关系

         O(1),O(logn),O(n)线性,O(n^2)抛物线,O(2^n)

     进程的类型(按进程与终端关系分类)

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

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

        注意:两者可相互转化

     进程分类(按进程占用资源多少分类)

          CPU-Bound:CPU密集型,非交互

           IO-Bound:IO密集型,交互

     进程状态

         运行态running

         就绪态ready

         睡眠态sleeping

             可中断 interruptable sleeping

             不可中断uninterruptable sleeping

         停止态ztopped

         僵死态zombie

       STAT

          R:running

          S:interruptable sleeping

          D:uninterruptable sleeping

          T:stopped

          Z:zombie

          +:前台进程

           l:多线程进程

           L:内存分页并带锁

          <:高优先级进程

           N:低优先级进程

           s:session leader,会话发起者

  • 进程管理工具

    进程管理工具

          pstree,ps,uptime,top,htop,iotop,free,vmstat,iostat,dstat,glances,kill

  •  作业管理

     Linun作业的控制  

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

         后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

     让作业运行于后台

       1、运行中的作业:ctrl+z

       2、command &

     后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台,剥离与终端关系

        nohup command &>/dev/null

        screen;command

    查看当前终端所有作业:jobs

    作业控制

       fg  [[%]JOB_NUM]:把指定的后台作业调回前台

       bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行

       kill [[%]JOB_NUM]:终止指定作业

       也可发信号来控制作业

   image.png

  • 计划任务

   一次性任务计划:未来某时间点运行一次任务

     at 命令

      at [option] TIME

          -V:显示版本信息

          -l | arq:列出指定队列中等待运行的作业

          -d | atrm:删除指定作业

          -c:查看具体业务

          -f /path/from/somefile:从指定文件中读取任务

          -m:任务完成后即使没有标准输出也给用户发邮件

     注意:作业执行命令结果以邮件方式通知给相关用户

       TIME:定义什么时候进行at这项任务时间

            HH:MM[YYYY-mm-dd]

               02:00  在今日的2点进行,若已过2点,则明天2点执行任务

               02:00 2018-05-04 规定在某年某月某一天进行该任务

            noon,midnight,teatime(4pm)

            tomorrow   

                17:20 tomorrow

            now+#{minutes,hours,days,OR weeks}

               now + 5 minutes 某个时间点再加几个时间后才进行该任务

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

      执行方式

        1、交互式:直接使用命令

        2、输入重定向

            at time <<EOF

             cmd1

             cmd2

           EOF

        3、at -f file:把要执行的任务放到文件中

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

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

       黑名单/etc/at.deny:默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行

      如果两个文件都不存在,只有root用户可以执行

      注意:黑名单是拒绝创建新任务,原来有的任务计划还可执行     

   batch  系统自行选择空闲时间去执行此处指定的任务

  周期性任务计划:周期性运行某任务

    cron 

     相关程序包

         cronie:主程序包

         cronie-anacron:cronie补充程序,用于监控cronie任务执行状况,如果cronie中任务在过去该运行时间点未能正常运行,则anacron会随后启动一次此任务

         crontabs:包含Centos提供系统维护任务

        确保crond守护处于运行状态

             Centos 7:systemctl status crond

             Centos 6:service crond status

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

      系统cron任务:系统维护作业

         /etc/crontab

      用户cront任务

        crontab命令

     日志:/var/spool/cron

  系统cron任务:/etc/crontab      

    ------------- minute (0 - 59)

   # |  .------------- hour (0 - 23)

   # |  |  .---------- day of month (1 - 31)

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

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

   # |  |  |  |  |

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

    分钟  小时  日  月  周  用户  要运行的任务

 例 每2分钟以root身份显示how are you?

    */2 * * * * root /bin/echo "how are you?"

  注意:要运行的任务如果是命令或者脚本,建议使用绝对路径或自定义一个拥有完整路径的环境变量

   时间表示法

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

     2、*:给定时间点上有效取值范围内的所有值;每...

     3、连续取值:#-#

     4、离散取值:#,#,#

     5、在指定时间范围上,定义步长;/# #即为步长

   时间格式

   @reboot      每次重启电脑

   @yearly        0 0 1 1 *   每年

   @annually    0 0 1 1 * 

   @monthly    0 0 1 * *

   @weekly      0 0 * * 0

   @daily         0 0 * * *

   @hourly      0 * * * *

   系统的计划任务

      /etc/crontab

     /etc/cron.d/        配置文件

     /etc/cron.hourly/    脚本

     /etc/cron.daily/       脚本

     /etc/cron.weekly/    脚本 

     /etc/cron.monthly/  脚本

  用户cron任务

    crontab命令定义

      每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME

   crontab命令

       crontab [-u user] [-l | -r | -e] [-i]

                -l:列出所有任务

               -e:编辑任务

               -r:移除任务

               -i:同-r配合使用,交互式模式删除

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

    控制用户执行计划任务

      /etc/cron.{allow,deny}  同at

    注意:运行结果的标准输出和错误以邮件方式通知相关用户

   没有被重定向的输出会以邮件方式发送给相关用户;root用户能够修改其它用户的作业

       丢弃邮件,输出重定向:

        1、command > /dev/null

        2、command &>/dev/null

   cron任务中的%有特殊用途;如果要在命令中使用%,需要转义,将%放置于单引号中,则可不用转义

       例

          * * * * * /bin/touch file-$(date +'%F-%H-%M-%S')

          * *** * /bin/touch file-$(date +\%F-\%H-\%M-\%S)

   在秒级运行任务  

         * * * * * for min in 0 1 2;do echo "hi"; sleep 20; done

   每7分钟运行一次

         sleep 命令

            sleep 7m;command

猜你喜欢

转载自blog.51cto.com/10461810/2112670