进程及任务管理

进程概念

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
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------97--98--99(CenOS6)

    实时优先级:99-0:值最大优先级最高
    Nice值:-20,19对应系统优先级100-139或99

    top命令
        RT---------------RT--0------20------39
        RT对应系统优先级的0-99


    cenos6
    系统优先级 0------------------97--98--99------------------99
    实时优先级 99-------------------2---1--0
    nice优先级                             -20 --- -19 ---0-----20

            注:nice优先级,调的是对应系统优先级的99-99,效果不明显。
    top命令
            RT-- -99 ------- -3 -2 0------20------39
                注:0左面的是负数

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内核:抢占式多任务(优先级高的,分配的cpu时间片多一点)
    进程类型:
        守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
        前台进程:跟终端相关,通过终端启动的进程
        注意:两者可相互转化
    进程状态:
        运行态:running
        就绪态:ready
        睡眠态:
            可中断:interruptable
            不可中断:uninterruptable 例如cat一个很大的文件,cat程序需要等待io。
        停止态:stopped,暂停于内存中,但不会被调度,除非手动启动 例如vim打开后
        僵死态:zombie,结束进程,父进程结束前,子进程不关闭

系统管理工具

进程的分类:
    CPU-Bound:CPU密集型,非交互  (计算型)
    IO-Bound:IO密集型,交互        (dd命令)
Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop,     glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
pstree命令:
    pstree-display a tree of processes
    -p 显示进程树进程的pid

ps

ps: process state
    ps-report a snapshot of the current processes
    Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
    什么参数也跟,默认显示,当前终端的进程。

    [root@centos7 ~]# ps
     PID TTY          TIME CMD
     10277 pts/1    00:00:01 bash
     11392 pts/1    00:00:00 ps

适用ps来查看进程信息
ps[OPTION]...
支持三种选项:
    UNIX选项如-a
    BSD选项如a
    GUN选项如--help
        •默认显示当前终端中的进程
        •a选项包括所有终端中的进程
        •x选项包括不链接终端的进程,没有与终端关联的进程。
        •u选项显示进程所有者的信息
        •f选项显示进程的父进程
        •o属性… 选项显示定制的信息:
            pid、comm、%cpu、%mem、state、tty、euser、ruser

ps aux

USER PID %CPU %MEM   VSZ  RSS TTY  STAT START  TIME COMMAND

VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSidentSize, 常驻内存集
STAT:进程状态
    R:running
    S: interruptables leeping    可中断的
    D: uninterruptable sleeping  不可中断的
    T: stopped
    Z: zombie
    +: 前台进程
    l: 多线程进程
    N:低优先级进程
    <: 高优先级进程
    s: session leader,会话(子进程)发起者
TIME:该进程累计占用cpu的时间


常用组合:-ef
    -e: 显示所有进程
    -f: 显示完整格式程序信息
常用组合:-eFH
    -F: 显示更完整格式的进程信息
    -H: 以进程层级格式显示进程相关信息

常用组合:自定义
    -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
    axo stat,euid(有效uid),ruid(真实uid),tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

    auxf :进程的父进程也显示出来

        ni: nice值
        pri: priority,系统优先级
        rtprio: 实时优先级

        psr: processor, CPU编号

[root@localhost yum.repos.d]# ps ax o pid,ni
   PID  NI
     1   0
     2   0
     3   0
     7   -
     8   0

常用选项

 ps aux
ps auxf
ps auxfo euid ruid ...
    ps axo pid,comm,%cpu,nice

[root@localhost yum.repos.d]# ps axo pid,comm,%cpu,nice
   PID COMMAND         %CPU  NI
     1 systemd          0.0   0
     2 kthreadd         0.0   0
     3 ksoftirqd/0      0.0   0
     7 migration/0      0.0   -
     8 rcu_bh           0.0   0
     9 rcuob/0          0.0   0
    10 rcuob/1          0.0   0
注:o后面必须跟 想要显示的选项。

ps -ef
ps -eFH

ps搜索
最灵活:ps选项| 其它命令 借助于管道

pgrep/pkill

进程搜索
按预定义的模式:pgrep
pgrep[options] patter
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示父进程为此处指定的进程的进程列表
pgrep -t pts/0 l
显示pts/0终端运行的进程, l 显示进程名称
pgrep -t pts/0 -a
显示的更详细,命令的参数都显示出来。

    pgrep -P 24944 -a
    24979 passwd
    显示24944的子进程,pid是24979 名称 passwd

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

$ pidof bash
显示系统中运行的bash进程。例如开其了多个终端,就会有多个进程。

系统工具

uptime
    显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、15分钟的平均负载,一般不会超过1)
    系统平均负载:
    指在特定时间间隔内运行队列中的平均进程数。
    如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
    如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

[root@localhost]# uptime -p
up 6 hours, 48 minutes

进程管理工具

top
实时跟踪,动态先显示内存cpu情况

top - 23:53:18 up  7:33,  3 users,  load average: 0.05, 0.06, 0.06             ##相当于uptime
Tasks: 364 total,   2 running, 362 sleeping,   0 stopped,   0 zombie        ##进程信息
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st###cpu信息
KiB Mem :  1001332 total,   113420 free,   168424 used,   719488 buff/cache        ##内存信息
KiB Swap:  2098172 total,  2098172 free,        0 used.   611316 avail Mem         ##内存信息

上面的信息可以关闭显示。

top:有许多内置命令:
    排序:
        P:以占据的CPU百分比,%CPU
        M:占据内存百分比,%MEM
        T:累积占据CPU时长,TIME+
        首部信息显示:
    uptime信息:l命令
    tasks及cpu信息:t命令 centos7切换显示方式或关闭。
    cpu分别显示:1 (数字)
    memory信息:m命令
    退出命令:q
    修改刷新时间间隔:s 默认是三秒  不建议刷新间隔太小,会给系统改造成负担
    终止指定进程:k 
        centos7会给出个默认的pid cup使用率最高的。可以手动指定pid
        选择pid 然后 Kill PID 1684 with signal [15]:默认发送15号信号。
    保存文件:W
        存到用户的家目录下 默认名字 .toprc

执行top后 输入上面相应指令集可以操作。

栏位信息简介
    us:用户空间
    sy:内核空间
    ni:调整nice时间
    id:空闲
    wa:等待IO时间
    hi:硬中断
    si:软中断(模式切换)
    st:虚拟机偷走的时间
    PID (Process Id):任务的进程IDPPID (Parent Process Pid):父任务的进程IDRUSER (Real User Name):任务的所有者真实名称UID (User Id):任务所有者IDUSER (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时间,精确到秒

top [OPENTION]
    -d #: 指定刷新时间间隔,默认为3秒
    -b: 以批次方式 一般情况屏幕显示不全,-b 一屏的往下翻,循环。
    -n #: 显示多少批次 刷新次数完毕退出,默认是一直刷新,但是时间间隔可以指定-d。
    -p cpu使用率排序 (默认)

top -d 5 -n 3
    每隔5秒刷新一次,刷新3次

htop命令:需从Fedora-EPEL源安装

默认带菜单,带颜色。f1-f10快捷键

http://172.16.0.1/fedora-epel/7/x86_64
选项:
    -d #: 指定延迟时间;
    -u UserName: 仅显示指定用户的进程;
    -s COLUME: 以指定字段进行排序;

子命令:执行htop以后执行的子命令
    s: 跟踪选定进程的系统调用;
    l: 显示选定进程打开的文件列表;
    a:将选定的进程绑定至某指定CPU核心;
    t: 显示进程树

内存工具

vmstat命令:虚拟内存信息
    vmstat[options] [delay [count]]
    vmstat 2 5
        2秒刷新一次,刷新5次

默认刷新一次
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      8 126136   1596 711028    0    0    13    16   37   40  0  0 99  0  0
显示完毕就退出

显示内容

    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:Timespent 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: 显示内存的统计数据

    [root@localhost ~]# vmstat -s
          1001332 K total memory
           162076 K used memory
           316484 K active memory
           236640 K inactive memory
           126664 K free memory
             1596 K buffer memory
           710996 K swap cache
          2098172 K total swap
                8 K used swap
          2098164 K free swap
             4521 non-nice user cpu ticks
              695 nice user cpu ticks
            10009 system cpu ticks
          2950649 idle cpu ticks
             3636 IO-wait cpu ticks
                0 IRQ cpu ticks
              160 softirq cpu ticks
                0 stolen cpu ticks
           371505 pages paged in
           458693 pages paged out
                0 pages swapped in
                2 pages swapped out
          1086138 interrupts
          1188701 CPU context switches
       1471940397 boot time
            47448 forks

pmap

pmap命令:进程的内存映射
report memory map of a process
pmap[options] pid[...]
    -x: 显示详细格式的信息;
    #pmap 1
另外一种实现:
    # cat /proc/PID/maps

    pmap PID -x
    [root@localhost ~]# pmap 47188 -x
    47188:   -bash
    Address           Kbytes     RSS   Dirty Mode  Mapping
    0000000000400000     884     648       0 r-x-- bash
    00000000006dc000       4       4       4 r---- bash
    00000000006dd000      36      36      36 rw--- bash
    00000000006e6000      24      24      24 rw---   [ anon ]
    0000000001f1b000    1456    1328    1328 rw---   [ anon ]
    00007f1d2f25f000  103580      52       0 r---- locale-archive
    00007f1d35786000      44      20       0 r-x-- libnss_files-2.17.so
    00007f1d35791000    2044       0       0 ----- libnss_files-2.17.so
    00007f1d35990000       4       4       4 r---- libnss_files-2.17.so
    00007f1d35991000       4       4       4 rw--- libnss_files-2.17.so
    00007f1d35992000      24       0       0 rw---   [ anon ]
    00007f1d35998000    1752     660       0 r-x-- libc-2.17.so
    00007f1d35b4e000    2048       0       0 ----- libc-2.17.so
    00007f1d35d4e000      16      16      16 r---- libc-2.17.so
    00007f1d35d52000       8       8       8 rw--- libc-2.17.so
    00007f1d35d54000      20      20      20 rw---   [ anon ]
    00007f1d35d59000      12       8       0 r-x-- libdl-2.17.so
    00007f1d35d5c000    2044       0       0 ----- libdl-2.17.so
    00007f1d35f5b000       4       4       4 r---- libdl-2.17.so
    00007f1d35f5c000       4       4       4 rw--- libdl-2.17.so
    00007f1d35f5d000     148     124       0 r-x-- libtinfo.so.5.9
    00007f1d35f82000    2048       0       0 ----- libtinfo.so.5.9
    00007f1d36182000      16      16      16 r---- libtinfo.so.5.9
    00007f1d36186000       4       4       4 rw--- libtinfo.so.5.9
    00007f1d36187000     132     116       0 r-x-- ld-2.17.so
    00007f1d3638f000      12      12      12 rw---   [ anon ]
    00007f1d3639e000       4       4       4 rw---   [ anon ]
    00007f1d3639f000      28      24       0 r--s- gconv-modules.cache
    00007f1d363a6000       8       8       8 rw---   [ anon ]
    00007f1d363a8000       4       4       4 r---- ld-2.17.so
    00007f1d363a9000       4       4       4 rw--- ld-2.17.so
    00007f1d363aa000       4       4       4 rw---   [ anon ]
    00007fff60224000     132      24      24 rw---   [ stack ]
    00007fff602a7000       8       4       0 r-x--   [ anon ]
    ffffffffff600000       4       0       0 r-x--   [ anon ]
    ---------------- ------- ------- ------- 
    total kB          116596    3188    1532

系统监控工具

glances

glances命令:EPEL源
交直观的现实系统状态,cpu 内存 进程 文件系统 网络 等状态
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
内建命令:
    a Sort processes automatically l Show/hide logs
    c Sort processes by CPU% b Bytes or bits for network I/O
    m Sort processes by MEM% w Delete warning logs
    p Sort processes by name x Delete warning and critical logs
    iSort processes by I/O rate 1 Global CPU or per-CPU stats
    d Show/hide disk I/O stats h Show/hide this help screen
    f Show/hide file system stats t View network I/O as combination
    n Show/hide network stats u View cumulative network I/O
    s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
    y Show/hide hddtempstats


常用选项:
    -b: 以Byte为单位显示网卡数据速率
    -d: 关闭磁盘I/O模块
    -f /path/to/somefile: 设定输入文件位置
    -o {HTML|CSV}:输出格式
    -m: 禁用mount模块
    -n: 禁用网络模块
    -t #: 延迟时间间隔
    -1:每个CPU的相关数据单独显示

C/S模式下运行glances命令
服务模式:
    glances -s -B IPADDR
    IPADDR: 指明监听的本机哪个地址
客户端模式:
    glances -c IPADDR
    IPADDR:要连入的服务器端地址

dstat

dstat命令:系统资源统计
dstat[-afv] [options..] [delay [count]]
    -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: 显示延迟最大的进程


   PLUGINS
   While anyone can create their own dstat plugins (and contribute them) dstat ships with a number of plugins already that extend its capabilities greatly.
   Here is an overview of the plugins dstat ships with:
    电源 风扇 mysql wifi 报文 网络 磁盘 cpu........

进程管理工具

kill

kill命令:
    向进程发送控制信号,以实现对进程管理
    显示当前系统可用信号:kill -l
    常用信号: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

    按PID:kill [-SIGNAL] pid…
    按名称:killall[-SIGNAL] comm…
    按模式:pkill[options] pattern
        -SIGNAL
        -u uid: effective user,生效者
        -U uid: real user,真正发起运行命令者
        -t terminal: 与指定终端相关的进程
        -l: 显示进程名
        -a: 显示完整格式的进程名
        -P pid: 显示父进程为此处指定的进程的进程列表

作业管理

Linux的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1) 运行中的作业:Ctrl+z
(2) 尚未启动的作业:# COMMAND &
此类后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系:

# nohup COMMAND &

查看所有作业:

# jobs

作业控制:

# fg[[%]JOB_NUM]:把指定的后台作业调回前台;
# bg[[%]JOB_NUM]:让送往后台的作业在后台继续运行;
# kill [%JOB_NUM]:终止指定的作业;

并行运行
vi f4.sh
F1.sh&
F2.sh&
F3.sh&

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

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

进程优先级

进程优先级调整:
    静态优先级:100-139
    进程默认启动时的nice值为0,优先级为120
    只有根用户才能降低nice值(提高优先性


nice命令:
nice [OPTION] [COMMAND [ARG]…]

renice命令:
    renice[-n] priority pid...

查看:
    ps axo pid,comm,ni

任务计划

Linux任务计划、周期性任务执行
未来的某时间点执行一次任务:at, batch
周期性运行某任务: cron

at命令

at命令:
    at [option] TIME

    TIME: ##时间点
        HH:MM [YYYY-mm-dd]
        noon, midnight, teatime
        tomorrow
        now+#{minutes,hours,days, OR weeks}

常用选项:
-q QUEUE:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:强制at发送邮件,表示执行完毕

/var/spool/at at任务的任务列表即使重启主机后,也不会丢失任务
at是以服务形式在系统中工作 /etc/rc.d/init.d/atd 首先要保证服务已经正常运行。

root@localhost ~]# systemctl status atd  ###centos7
[root@yangyouwei ~]# service atd status  ###centos6
atd (pid  7182) is running...

如果atd服务没有启动

[root@yangyouwei ~]# at now +1minutes
at> ls
at> echo "hello word"  
at> <EOT>
job 1 at 2016-07-21 18:19
Can't open /var/run/atd.pid to signal atd. No atd running?

at.deny 默认为空,黑名单
at.allow 没人没有此文件,白名单

   The superuser may use these commands in any  case.   For  other  users,
   permission  to  use  at  is  determined  by the files /etc/at.allow and
   /etc/at.deny. ##控制普通用户使用at命令,通过两个文件控制,at.allow/at.deny

   If the file /etc/at.allow exists, only usernames mentioned  in  it  are
   allowed to use at.##r如果at.allow文件存在,则只有在其中的用户才能使用at命令

   If  /etc/at.allow  does not exist, /etc/at.deny is checked, every user-
   name not mentioned in it is then allowed to use at.如果不存在白名单,其他用户又不在黑名单中,
    则可以使用at命令

   If neither exists, only the superuser is allowed use of at.
    如果两个文件都不存在则仅管理员可硬使用at

   An empty /etc/at.deny means that every user is allowed use  these  com-
   mands, this is the default configuration.
    默认黑名单为空,所有用户都可以使用at命令。

at and batch read commands from standard input or a specified file which are to be executed at a later time, using /bin/sh.
at和batch通过标准输入或文件获取要执行的命令,使用/bin/sh在指定的时间运行它们。

手动执行
[root@yangyouwei ~]# at now +1minutes
at> cd /
at> ###ctrl+d
job 3 at 2016-07-21 18:24
[root@yangyouwei ~]# at -l
6 2016-07-21 18:36 a root ###前面的数字为任务号

[root@yangyouwei ~]# ls /var/spool/at/  ###生成任务后,会在/var/spool/at/目录下生成任务文件。(脚本,其中定义了运行要执行任务需要的变量等..)
a0000601759c71 ##作业号加随机数

at -c 5
查看任务相当cat /var/spool/at/a0000601759c71

通过文件获取任务

at now +1min -f FILE -q
at now +min -q < /PATH/TO/FILE

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户.编写脚本时将标准输出和标准错误输出都重新定向到/dev/null

crond也一样有标准输出的都要重新定向到/etc/null,较长的任务,不建议使用at直接写入,最好写入脚本,使用at执行脚本。

at命令也支持 -f 通过文件获取要执行的任务,用户手动创建任务,可以使用标准输入,手动输入任务命令。

即使没有标准输出的任务,也可以强制给用户邮件,提示用户任务执行完毕。 at -m

如果指定时间,没指定日期,时间小于当前时间。则任务默认第二天的那个时间运行。

普通用户创建的任务,时间到期后,atd会使用普通用户身份开启shell,后运行任务。


计划任务

batch命令:

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

周期性任务计划:cron

使用cron可以实现用户人和系统任务
用户任务需要用户使用crontab命令自己添加。

相关的程序包:
    cronie: 主程序包,提供crond守护进程及相关辅助工具
    cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
        主要针对家用电脑,笔记本。服务器作用不大。
    crontabs:包含CentOS提供系统维护任务
        主要针对系统周期性服务的。

cronie
    [root@yangyouwei ~]# rpm -q cronie
    cronie-1.4.4-15.el6_7.1.x86_64
    [root@yangyouwei ~]# rpm -ql cronie
    /etc/cron.d
    /etc/cron.d/0hourly
    /etc/cron.deny
    /etc/pam.d/crond
    /etc/rc.d/init.d/crond
    /etc/sysconfig/crond
    /usr/bin/crontab
    /usr/sbin/crond
    /usr/share/doc/cronie-1.4.4
    /usr/share/doc/cronie-1.4.4/AUTHORS
    /usr/share/doc/cronie-1.4.4/COPYING
    /usr/share/doc/cronie-1.4.4/ChangeLog
    /usr/share/doc/cronie-1.4.4/INSTALL
    /usr/share/doc/cronie-1.4.4/README
    /usr/share/man/man1/crontab.1.gz
    /usr/share/man/man5/crontab.5.gz
    /usr/share/man/man8/cron.8.gz
    /usr/share/man/man8/crond.8.gz
    /var/spool/cron

cronie-anacron
    [root@yangyouwei ~]# rpm -q cronie-anacron
    cronie-anacron-1.4.4-15.el6_7.1.x86_64
    [root@yangyouwei ~]# rpm -lq cronie-anacron
    /etc/anacrontab
    /etc/cron.hourly/0anacron
    /usr/sbin/anacron
    /usr/share/man/man5/anacrontab.5.gz
    /usr/share/man/man8/anacron.8.gz
    /var/spool/anacron
    /var/spool/anacron/cron.daily
    /var/spool/anacron/cron.monthly
    /var/spool/anacron/cron.weekly

crontabs
    [root@yangyouwei ~]# rpm -q crontabs
    crontabs-1.10-33.el6.noarch
    [root@yangyouwei ~]# rpm -lq crontabs
    /etc/cron.daily
    /etc/cron.hourly
    /etc/cron.monthly
    /etc/cron.weekly
    /etc/crontab   ###系统周期性任务,普通用户无权限更改。
    /usr/bin/run-parts
    /usr/share/man/man4/crontabs.4.gz

确保crond守护处于运行状态:
    CentOS 7:
        systemctlstatus crond
        ...running...
    CentOS 6:
        service crondstatus

计划周期性执行的任务提交给crond,到指定时间会自动运行
    系统cron任务:系统维护作业
        /etc/crontab  ###系统周期任务文件
    用户cron任务:
        crontab命令

系统周期性任务

系统cron任务:/etc/crontab

    [root@yangyouwei ~]# cat /etc/crontab 
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin  ####路径变量,用户需要可自定义。
    MAILTO=root  ###完成任务或有标准输出,给谁发邮件
    HOME=/      ###执行任务时的工作目录

    # For details see man 4 crontabs

    # 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  ###user-name指的是命令以谁的身份执行的。

例如:晚上9点10分运行echo命令;
    10 21 * * *gentoo/bin/echo "Howdy!"

可以直接编辑此文件,添加系统周期任务任务。运行系统任务,会生成日志
/var/log/cron 用户自己创建的任务

时间表示法:

(1) 特定值;
    给定时间点有效取值范围内的值
(2) *
    给定时间点上有效取值范围内的所有值
    表示“每...”
(3) 离散取值:
    #,#,#
(4) 连续取值:-
    #-#
(5) 在指定时间范围上,定义步长:
    /#: #即为步长
例如:每3小时echo命令;
    0 */3 * * * gentoo/bin/echo "howdy!"

时间表示

@reboot : Run once after reboot.
@yearly : Run once a year, ie. "0 0 1 1 ".
@annually : Run once a year, ie. "0 0 1 1 
".
@monthly : Run once a month, ie. "0 0 1 ".
@weekly : Run once a week, ie. "0 0 0".
@daily : Run once a day, ie. "0 0 ".
@hourly : Run once an hour, ie. "0 
*".

@hourly user-name command to be executed

系统的计划任务脚本

/etc/crontab  系统周期任务文件
/etc/cron.d/ 配置文件

/etc/cron.hourly/ 脚本
/etc/cron.daily/脚本
/etc/cron.weekly/脚本
/etc/cron.monthly/脚本

[root@yangyouwei ~]# ls /etc/cron.d  ###配置文件
0hourly  raid-check  sysstat
[root@yangyouwei ~]# cat /etc/cron.d/0hourly 
SHELL=/bin/bash                        ##使用那个shell运行脚本
PATH=/sbin:/bin:/usr/sbin:/usr/bin    ##路径变量
MAILTO=root                            ##邮件发送给给root
HOME=/                                ##执行脚本时的工作目录
01 * * * * root run-parts /etc/cron.hourly        ##每小时运行/etc/cron.hourly/目录下的所有脚本
[root@yangyouwei ~]# ls /etc/cron.hourly/
0anacron
[root@yangyouwei ~]# cat /etc/cron.hourly/0anacron 
#!/bin/bash
# Skip excecution unless the date has changed from the previous run 
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi

# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power &> /dev/null
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

[root@yangyouwei ~]# which run-parts
/usr/bin/run-parts
是个命令,可以依次运行某个目录下的所有脚本。不是并行运行所有脚本
run-parts /PATH/TO/ ##后接一个目录即可。

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:要执行的任务
    •当执行任务时,更新/var/spool/anacron/文件时间戳

管理临时文件

rhel7.0之前使用tmpwatch工具定时清除临时文件。
rhel7.0使用systemd-tmpfiles-setup服务实现
配置文件:
    /etc/tmpfiles.d/*.conf
    /run/tmpfiles.d/*.conf
    /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命令实现

crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令:
    crontab[-u user] [-l | -r | -e] [-i]
    -l: 列出所有任务;
    -e: 编辑任务;
    -r: 移除所有任务;
    -i:同-r一同使用,以交互式模式移除指定任务
    -u user: 仅root可运行,指定用户管理cron任务

at和crontab
    一次性作业使用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
    没有被重定向的输出会被邮寄给用户
    root用户能够修改其它用户的作业

crontab -e

* command to be executed ###不用写user-name默认以当前创建用户的身份执行。

[root@yangyouwei ~]# crontab -e
no crontab for root – using an empty one

    • wall hello
      ~
      ~
      ~
      ~
      ~
      "/tmp/crontab.4oxhQU" 1L, 21C written
      crontab: installing new crontab
      [root@yangyouwei ~]# ll /var/spool/cron/
      total 4
      -rw——-. 1 root root 21 Jul 21 22:32 root
      [root@yangyouwei ~]#

    注意:运行结果的标准输出和错误以邮件通知给相关用户
    (1) COMMAND > /dev/null
    (2) COMMAND &> /dev/null

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

    思考:
    (1) 如何在秒级别运行任务?

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

    (2) 如何实现每7分钟运行一次任务?
    sleep命令:
    sleep NUMBER[SUFFIX]…
    SUFFIX:
    s: 秒, 默认
    m: 分
    h: 小时
    d: 天

    练习
    1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”
    2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
    3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
    4、工作日时间内,每小执行一次“ip addr show”命令

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

    评论列表(1条)

    • 马哥教育
      马哥教育 2016-09-10 11:05

      文章结构清晰,层次分明,赞一个哦。