Linux之进程和计划任务

进程的概念

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

    Process: 运行中的程序的一个副本,是被载入内存的一个指令集合进程ID(Process ID,PID)号码被用来标记各个进程

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

             存在生命周期

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

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

    进程创建:

        init:第一个进程

                父子关系

        进程:都由其父进程创建, ,CoW

                fork(), clone()

进程优先级

    进程优先级

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

            0-139 (CentOS4,5)

                    各有140 个运行队列和过期队列 0-98 ,99 (CenOS6)

        实时优先级: 99-0 :值最大优先级最高

         Nice 值:-20,19 对应系统优先级100-139或99

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

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

进程相关概念

    进程内存:

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

        LRU :Least Recently Used 近期最少使用算法, 释放内存物理地址空间和线性地址空间

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

    IPC: Inter Process Communication

        同一主机上

            signal

            shm: shared memory

            semophore 信号量,一种计数器

        不同主机上:

            rpc: remote procedure call

            socket: IP 和端口号

进程状态

    Linux 内核:抢占式多任务

    进程类型:

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

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

            注意:两者可相互转化

    进程状态:

        运行态:running

        就绪态:ready

        睡眠态:

            可中断:interruptable

            不可中断:uninterruptable

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

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

系统管理工具

    进程的分类:

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

        IO-Bound :IO 密集型,交互

    Linux 系统状态的查看及管理工具:pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup

    pstree 命令:

        pstree – display a tree of processes

    ps: process state

        ps – report a snapshot of the current processes

        Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件

列举进程ps

     ps [OPTION]…

        支持三种选项:

            UNIX选项如-A -e

            BSD选项如a

            GUN选项如–help

        • 默认显示当前终端中的进程

            • a 选项包括所有终端中的进程

blob.png

            • x 选项包括不链接终端的进程

            • u 选项显示进程所有者的信息

blob.png

            • f 选项显示进程的父进程

                          选项可组合使用:

blob.png

            • o 属性… 选项显示定制的信息:

                pid 、comm 、%cpu 、%mem 、state 、tty 、euser(执行命令生效的用户)、ruser(执行此命令的用户)

                          部分结果图:

blob.png

进程管理工具

    VSZ: Virtual memory SiZe ,虚拟内存集,线性内存

    RSS: ReSident Size, 常驻内存集

    STAT:进程状态

       R:running

       S: interruptable sleeping(可中断的休眠)

       D: uninterruptable sleeping

       T: stopped

       Z: zombie

       +: 前台进程

       l: 多线程进程

       N:低优先级进程

       <: 高优先级进程

       s: session leader,会话(子进程)发起者

    常用组合:-ef

              -e: 显示所有进程

              -f: 显示完整格式程序信息

    常用组合:-eFH

              -F: 显示更完整格式的进程信息

              -H: 以进程层级格式显示进程相关信息

blob.png

    常用组合:自定义

              -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

              axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm 

    ni:nice值

    pri:priority,优先级

    psr:processor,CPU编号

    rtprio:实时优先级

搜索进程

    最灵活:ps 选项 | 其它命令

    按预定义的模式:pgrep

blob.png

        pgrep [options] pattern

        -u uid: effective user ,生效者

        -U uid: real user ,真正发起运行命令者

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

        -l: 显示进程名

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

        -P pid: 显示指定进程的子进程

    按确切的程序名称:/sbin/pidof

        $pidof bash

blob.png

系统工具

    uptime

blob.png

        显示当前时间,系统 已启动的时间、当前上线人数,系统平均负载(1 、5 、10 分钟的平均负载,一般不会超过1) )

    系统平均负载:

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

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

    如果linux主机是1个双核CPU的话,当Load Average为6的时候说明机器已经被充分会用了

进程管理工具

    top:有许多内置命令(先输入top进入界面):

        排序:

            P:以占据的CPU百分比,%CPU

            M:占据内存百分比,%MEM

            T:累积占据CPU时长,TIME+

        首部信息显示:

            uptime信息:l 命令

            tasks及cpu信息:t 命令

            cpu分别显示:1 ( 数字)

            memory信息:m 命令 切换数字、图形方式显示

         退出命令:q

         修改刷新时间间隔:s

         终止指定进程:k

         保存文件:W

    选项

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

        -b: 以批次方式

        -n #: 显示n批次  然后结束退出

blob.png

栏位信息简介:可对应上图中的数据

    us:用户空间

    sy:内核空间

    ni:调整nice 时间

    id:空闲

    wa:等待IO 时间

    hi:硬中断

    si:软中断(模式切换)

    st:虚拟机偷走的时间

    PID (Process Id): 任务的进程ID

    PPID (Parent Process Pid): 父任务的进程ID

    RUSER (Real User Name): 任务的所有者真实名称

    UID (User Id): 任务所有者ID

    USER (User Name): 任务所有者名称

    GROUP (Group Name): 任务所有者群组名

    TTY (Controlling Tty): 终端

    PR (Priority): 优先级

    %CPU (CPU usage):CPU 使用率

    %MEM (Memory usage (RES)): 内存使用率

    S (Process Status): 进程状态

    TIME+ (CPU Time, hundredths):CPU

内存工具

    vmstat 命令:虚拟内存信息     可使用man帮助查看具体资料

        vmstat [options] [delay [count]]

        vmstat 2 5(表示两秒执行一次,执行五次后退出

blob.png

      procs:

        r :等待运行的进程的个数,和核心数有关

        b :处于不可中断睡眠态的进程个数( 被阻塞的队列的长度)

      memory:

        swpd: 交换内存的使用总量

        free:空闲物理内存总量

        buffer:用于buffer 的内存总量

        cache:用于cache 的内存总量

      swap:

        si:从磁盘交换进内存的数据速率(kb/s)

        so:从内存交换至磁盘的数据速率(kb/s)

      io:

        bi:从块设备读入数据到系统 的 速率(kb/s)

        bo: 保存数据至块设备 的 速率

      system:

        in: interrupts, 中断速率,包括时钟

        cs: context switch, 进程切换速率

      cpu:

        us:Time spent running non-kernel code

        sy: Time spent running kernel code

        id: Time spent idle. Linux 2.5.41 前, 包括IO-wait time.

        wa: Time spent waiting for IO. 2.5.41 前,包括in idle.

        st: Time stolen from a virtual machine. 2.6.11 前, unknown.

    选项:

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

blob.png

    pmap 命令 :进程对应的内存 映射

    pmap [options] pid(进程编号) […]

blob.png

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

blob.png

        #pmap 1

        另外一种实现:

        # cat /proc/PID/maps

系统监控工具

    dstat 命令:系统资源统计  (需要自己安装)

    dstat [-afv] [options..] [delay [count]]   (动态观察)

blob.png

        -c: 显示cpu 相关信息

        -C #,#,…,total

        -d: 显示disk 相关信息

        -D total,sda,sdb,…

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

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

        -n: 显示network 相关统计数据

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

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

        -s: 显示swapped

      命令的组合使用:

        –tcp

        –udp

        –unix

        –raw

        –socket

        –ipc

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

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

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

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

进程管理工具

    kill 命令

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

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

blob.png

        常用信号:man 7 signal

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

            2) SIGINT: 中止正在运行的进程;相当于Ctrl+c

            9) SIGKILL: 杀死正在运行的进程:强制杀死正在运行的进程

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

            18) SIGCONT :继续运行

            19) SIGSTOP :后台休眠

        指定信号的方法:

            (1) 信号的数字标识;1, 2, 9

            (2) 信号完整名称;SIGHUP

            (3) 信号的简写名称;HUP

作业管理

    Linux 的作业控制

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

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

    如何让作业运行于后台?

        (1) 运行中的作业: Ctrl+z

        (2) 尚未启动的作业:# COMMAND &

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

        # nohup COMMAND & #screen;COMMAND

    查看所有作业

        # jobs

    作业控制

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

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

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

blob.png

        jobs查询作业  然后fg 1返回操作界面

blob.png

并行运行进程

    同时运行多个进程,提高效率

       1、编写脚本

        vi all.sh

            f1.sh&

            f2.sh&

            f3.sh&

       2、(f1.sh&);(f2.sh&);(f3.sh&)

       3、{ f1.sh& f2.sh& f3.sh& }

Linux 任务计划、周期性任务执行

        at:未来的某时间点执行一次 任务

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

        cron:周期性运行某任务

at任务

    at命令:at [option] TIME   适合一次性 临时性的任务

blob.png

                创建的at任务会存到/var/spool/at/目录下  cat可直接查看

    常用选项

        -V 显示版本信息:

        -l: 列出指定队列中等待运行的作业;相当于atq

        -d: 删除指定的作业;相当于atrm

        -c: 查看具体作业任务

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

        -m: 当任务 被完成之后,将给用户发送邮件,即使没有标准输出

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

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

        HH:MM [YYYY-mm-dd]

        noon, midnight, teatime (4pm)

        tomorrow

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

    HH:MM 02:00

        在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务

    HH:MM YYYY-MM-DD 04:00 2016-09-20

        规定在某年某月的某一天的特殊时刻进行该项任务

    HH:MM[am|pm] [Month] [Date]

        04pm March 17

        17:20 tomorrow

    HH:MM[am|pm] + number [minutes|hours|days|weeks]

        在某个时间点再加几个时间后才进行该项任务

        now + 5 minutes

        04pm + 3 days

    执行方式

        1)交互式 2)输入重定向 3)at –f 文件

    依赖与atd服务, 需要启动才能实现at任务

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

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

        先寻找/etc/at.allow 文件,文件用中的使用者才能使用 at,没有在这个文件中的使用者则不能使用 at(即使没有写在at.deny当中)

        如果/etc/at.allow 找 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 用 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用用 者则可使用 at 命令。

        如果两个文件都不存在有,只有 root用可以使用at 这个命令

周期性计划任务cron

    周期性任务计划:cron

        相关的程序包:

            cronie: 主程序包,提供crond 守护进程及相关辅助工具

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

            crontabs :包含CentOS

    确保crond 守护处于运行状态

        CentOS 7:

            systemctl status crond

blob.png

        CentOS 6:

            service crond status

blob.png

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

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

            /etc/crontab

        用户cron 任务:

            crontab 命令

    日志:/var/log/cron

    系统cron 任务:/etc/crontab

    注释行以 # 开头

    详情参见 man 5 crontab

        # Example of job definition:

        # .—————- 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

blob.png

    例如:晚上9点10分运行echo 命令;

        10 21 * * * centos /bin/echo "Howdy!"

    时间表示法:

    (1) 特定值;

        给定时间点有效取值范围内的值(10 21 1-10,20,30  一月的10,20,30号21点10分执行)

    (2) *

        给定时间点上有效取值范围内的所有值

        表示“每…”(*10 每十分钟)

    (3) 离散取值:

        #,#,#

    (4) 连续取值:-

        #-#

    (5) 在指定时间范围上,定义步长:

        /#: # 即为步长(/#10 每十分钟)

    例如:每3小时echo 命令;

        0 */3 * * * centos /bin/echo "howdy!"

时间格式  系统自定义

    @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 * * * *

系统的计划任务

    /etc/crontab

    /etc/cron.d/ 配置文件

    /etc/cron.hourly/ 脚本

    /etc/cron.daily/ 脚本

    /etc/cron.weekly/ 脚本

    /etc/cron.monthly/脚本

blob.png

                每隔一分钟执行一次目录/etc/cron.hourly里的脚本

anacron系统

    运行计算机关机时cron 不运行的任务,CentOS6.0以后版本取消anacron 服务,由crond 服务管理。

    假设计算机没有一直开机

    对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要

    对偶尔要关机的服务器很有用

    配置文件:/etc/anacrontab ,负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly 中系统任务。/etc/cron.hourly/ 由/cron.d/0hourly 执行

    • 字段1:如果在这些日子里没有运行这些任务……

    • 字段2:在重新引导后等待这么多分钟后运行它

    • 字段3:任务识别器,在日志文件中标识

    • 字段4:要执行的任务

管理临时文件

    rhel6.0 使用/etc/cron.daily/tmpwatch 定时清除临时文件。

    rhel7.0 使用systemd-tmpfiles-setup 服务实现

    配置文件:

        /etc/tmpfiles.d/*.conf

        /run/tmpfiles.d/*.conf

blob.png

        /usr/lib/tmpfiles/*.conf

        /usr/lib/tmpfiles.d/tmp.conf

        d /tmp 1777 root root 10d

        d /var/tmp 1777 root root 30d

    命令:

        systemd-tmpfiles –clean|remove|create configfile

计划任务

    用户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命令(/var/spool/at/目录) 重复性作业使用crontab
Create (创建) at time crontab –e
List(查看任务) at -l  crontab -l
Details(看计划任务的详细定义) at -c jobnum(作业号) N/A(配置文件、打开计划任务)
Remove(删除) at -d jobnum crontab -r
Edit(编辑创建的任务) N/A(只能改配置文件) crontab -e

    没有被重定向的输出会被邮寄给用户

    根用户能够修改其它用户的作业

        创建一个计划任务

                    crontab -e命令会打开一个vim界面,然后按照格式创建计划任务就好

blob.png

blob.png

blob.png

                 计划任务执行 touch了file文件

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

        (1) COMMAND > /dev/null

(2) COMMAND &> /dev/null

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

    sleep 命令

        sleep NUMBER[SUFFIX]…   休眠n时间再执行计划任务

            SUFFIX:

                s: 秒, 默认

                m: 分

                h: 小时

                d: 天

原创文章,作者:旧城以西,如若转载,请注明出处:http://www.178linux.com/48902