zoukankan      html  css  js  c++  java
  • 入手内核的前篇之进程和计划任务

    概念的介绍
     
    内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等。
    进程,在linux系统中,触发一个事件时,系统都会将它定义成一个进程,并且给进程一个ID我们称之为PID,也就是进程号,这个进程创建与之能使用的权限和功能也和创建者有关。
    在CentOS 7以前的第一个进程是init
    [root@magedu6 ~]# pstree               #以进程树的形式显示当前进程
    init─┬─NetworkManager─┬─dhclient
         │                └─{NetworkManager}
         ├─abrtd
         ├─acpid
         ├─atd
         ├─auditd───{auditd}
         ├─automount───4*[{automount}]
    ....

    而在CentOS 7上第一个进程是systemd

    systemd─┬─NetworkManager─┬─2*[dhclient]
            │                └─2*[{NetworkManager}]
            ├─auditd───{auditd}
            ├─automount───4*[{automount}]
            ├─crond
            ├─dbus-daemon───{dbus-daemon}
            ├─login───bash
            ├─master─┬─pickup
            │        └─qmgr
    ...

    Process:  运行中的程序的一个 副本,是被 载入内存的一个指令集合
    进程ID (Process ID ,PID )号码被用来标记各个进程
    UID 、GID 、和SELinux 语境决定对文件系统的存取和 访问权限,
    通常 从执行进程的 用户来继承
    存在生命周期
    task struct :Linux 内核存储进程信息的数据结构格式
    task list :多个任务的的task struct 组成的链表

    进程:都由其父进程创建,CoW #CoW写时复制技术
    fork(), clone()

    过程这样的

    1、系统先以fork的方式复制一个与服进程相同的进程,这个进程与服进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别PID。

    2、然后新产生的进程开始加载实际要运行的程序进行执行。#只有进行写入操作的时候才会这样。

    进程间通信

      1.主机上的进程通信可以通过signal(信号指令)、shm(共享内存空间)、semerphor(旗语)

      2.两个主机间的通信通过rpc(远程过程调用)、socket(套接字)

    进程优先级:
      系统优先级: 数字越小,优先级越高
        0-139 (CentOS4,5) )
          各有140 个运行队列和过期队列
        0-98 ,99 (CentOS6) )
      实时优先级: 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 负责转换线性和物理地址
    TLB:Translation Lookaside Buffer 翻译 后备 缓冲器, 用于保存虚拟地址和物理地址映射关系的缓存 #你实际使用多少,但给你多少
    IPC: Inter Process Communication
    同一主机: signal: 发信号
    shm: shared memory 共享内存 #两个进程要通信,他们会创建个共享内存来通信
    semaphore: 信号量,一种计数器 #当你使用一个程序调用一个进程,你会给个标记表示你在使用,这样其他进程无法再次调度。
    不同主机:rpc: remote procedure call #远程过程调用 当你程序使用的时候需要使用B程序调用下,调用完后返回A进程
    socket: IP #unix套接字文件实现

    进程状态

        linux内核:抢占式多任务 #在以前操作系统中是协作式多任务,意思是一个任务得到了CPU时间,除非它自己放弃使用CPU,否则将完全霸占CPU,而抢占式多任务系统的控制权在操作系统这,操作系统会轮询的问每个任务是否需要CPU的使用权,而过一段时间后会收回CPU使用权,将它放在最后,在去询问下一个任务,这样的好处是不会造成任务锁死

    进程类型:
    守护进程: daemon, 在系统引导过程中启动的进程, 和 终端无关进程
    前台进程:跟终端相关,通过终端启动的进程
    #两者可相互转换
     
    进程状态:
    运行态:running
    就绪态:ready #等待CPU时间片 调用
    睡眠态:
    可中断:interruptable
    不可中断:uninterruptable #比如IO操作文件,没有读取完你不能中断
    停止态:stopped, 暂停于内存,但不会被调度,除非手动启动 #当你用VI编辑的时候就是这个状态
    僵死态:zombie,结束进程,父进程结束前,子进程不关闭
      一些命令的使用。  
    系统管理工具
    进程的分类:
    CPU-Bound :CPU 密集型,非交互 比如查找计算 排序,对CPU占用率高的进程
    IO-Bound :IO密集型,交互 。等待I/O时间长的进程 #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
    ps: process state
    ps - report a snapshot of the current processes
    Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件中。  
    列举进程ps
    支持三种选项:
    UNIX 选项 如 如-A -e

    [root@localhost ~]# ps -A -e #-A和 -e 效果是一样的。 PID TTY TIME CMD 1 ? 00:00:03 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:02 ksoftirqd/0 7 ? 00:00:00 migration/0 8 ? 00:00:00 rcu_bh
    BSD 选项 如 如a

    [root@localhost ~]# ps a PID TTY STAT TIME COMMAND 2180 tty1 Ss+ 0:00 -bash 6810 pts/0 Ss 0:00 -bash 7231 pts/0 R+ 0:00 ps a
    GNU 选项 如 如--help
    ...
    常用组合:-ef
    -e: 显示所有进程
    -f: 显示完整格式程序信息
    常用组合:-eFH
    -F: 显示更完整格式的进程信息
    -H: 以进程层级格式显示进程相关信息
    常用组合:自定义
    -eo pid,tid,class,rtprio(优先级),ni,pri,psr,
    pcpu,stat,comm
    axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid, #挑一些显示,多个选项用逗号隔开
    pid,pcpu,comm,cmd
    euid:有效用户
          ruid:实际用户执行命令的人
    这三种选择一种适合自己的就好。
     
    top命令类似windows下的任务管理器
    一些常用指令
    选项说明
    -d 指定每两次屏幕信息刷新之间的时间间隔
    -i 不显示限制或者僵死的进程信息
    -c 显示进程的整个命令路径,而不是只显示命令名称
    -s 使top命令在安全模式下运行。此时top的交互式指令被取消,避免潜在危险
    -b 分屏显示输出信息,结合“-n”选项可以将屏幕信息输出到文档
    -n top输出信息更新的次数,完成后将退出top命令

     还有一些交互式命令      

    top :有许多内置命令:
    排序:
    P :以占据的CPU 百分比,%CPU
    M :占据内存百分比,%MEM
    T :累积占据CPU 时长,TIME+
     
    首部信息显示:
    uptime 信息:l 命令
    tasks 及cpu 信息:t 命令
    cpu 分别显示:1 ( 数字) #可以显示具体每个CPU情况
    us :用户空间
    sy :内核空间
    ni :调整nice 时间
    id :空闲
    wa :等待IO 时间
    hi :硬中断 #硬件资源操作
    si :软中断(模式切换)进程切换
    st :虚拟机偷走的时间
    memory 信息:m 命令 #内存信息
    退出命令:q
    修改刷新时间间隔:s
    终止指定进程:k
    保存文件:W #存在家目录下 .toprc
    top输出分为统计信息区和进程信息区两个部分,
    1)统计信息区
    • 01:34:10:表示当前系统时间。
    • up 14:20:表示系统已经运行的时间
    • 2 users:当前登录系统的用户数
    • load average :表示系统平均负载,三个数值分别表示1分钟 5分钟 15分钟到现在的系统平均负载值。

    第二行和第三行分别是进程和CPU信息

    • Tasks:113 total:进程的总数。
    • 2 running:正在运行的进程。
    • 111 sleeping:处于休眠状态的进程。
    • 0 stopped:停止的进程数。
    • 0 zombie:僵死的进程数。
    • %Cpu(s):0.0us:表示用户进程占用CPU的百分比。
    • 0.3 sy:系统进程占用CPU的百分比。
    • 0.0 ni:用户进程空间内改变过优先级的进程占用CPU的百分比。
    • 99.7 id:空闲CPU占用的百分比。
    • 0.0 wa:等待输入、输出的进程占用CPU的百分比。

    最后 两行输出的是内存信息

    • KiB Mem:483856 total:系统的物理内存大小。
    • 64972 free:目前空余内存大小。
    • 115984 used:已经使用的物理内存大小。
    • 302900 buff/cache:用作内核缓冲区的内存大小。
    • KiB Swap:2097148 total:交换分区内存大小。
    • 2096352 free:空闲的交换分区大小。
    • 796 used:已经使用的交换分区大小。
    • 309652 avail Mem:缓存大小。

    进程信息区

    进程信息区显示了每个进程的运行状态,我们先来看一下每列输出的含义。

    • PID:进程的ID。
    • USER:进程所有者的用户名。
    • PR:进程优先级。
    • NI:nice值。负值表示高优先级,正值表示低优先级。
    • VIRT:进程使用的虚拟内存总量,单位KB. VIRT=SWAP+RES。
    • RES:进程使用的、未被患处的物理内存大小,单位KB。RES=CODE+DATA,其中,CODE为执行代码占用的物理内存大小,DATA为数据占用的内存大小。
    • SHR:共享内存大小,单位KB。
    • S:进程状态,D表示不可终端的睡眠状态,R表示运行状态,S表示睡眠状态,T表示跟踪/停止,Z表示僵死进程。
    • %CPU:上次更新到现在的CPU时间占用百分比。
    • %MEM:进程占用的物理内存百分比。
    • TIME+:进程总计使用的CPU时间,单位为1/100秒。
    • COMMAND:正在运行进程的命令名或者命令路径。
     
    进程优先级调整:
    静态优先级:100-139
    进程默认启动时的nice 值为0 ,优先级为120
    只有根用户才能降低nice 值(提高优先性)
    nice 命令:
    nice [OPTION] [COMMAND [ARG]...]
    nice -n 10 ping 127.0.0.1 #指定优先级运行
    特殊用法:nice --6 d if=/dev/zero of=/dev/null
    renice 命令: #能根据PID修改优先级
    renice [-n] priority pid...
    查看:
    ps axo pid,comm,ni
     
    搜索进程
    最灵活:ps 选项 | 其它命令
    按预定义的模式:pgrep
    pgrep [options] pattern
    -u uid: effective user ,生效者
    -U uid: real user ,真正发起运行命令者
    -t terminal: 与指定终端相关的进程
    pgrep -lt pts/1
    -l: 显示进程名
    -a: 显示完整格式的进程名 #centos 7上才有的选项
    -P pid: 显示指定进程的子进程
    按确切的程序名称:/sbin/pidof
    pidof bash #查看进程编号,这个命令是软链接,但是链接对象你不能用  
    一个进程可以拥有多个线程,但线程不能单独存在。
    一个进程里多个线程之间的资源是共享的,线程消耗资源是很少的
     
    uptime
    显示当前时间,系统已启动的时间,也能显示负载情况。load Average 1 5 10分钟内的负载
    一个CPU内核当前活动进程数不大于3,表示正常,超过5系统性能就有问题。
     
    #脚本里第一行不写bash 执行的是命令,你用ps aux | grep f1.sh #会搜索不到
    vmstat 命令:虚拟内存信息
    vmstat [options] [delay [count]]
    vmstat 2 5
    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: 显示内存数据

    [root@localhost ~]# vmstat 1 3 #一秒显示依次,3次后结束 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 1340 90868 0 253020 0 0 5 4 40 53 0 0 100 0 0 0 0 1340 90852 0 253020 0 0 0 0 122 173 0 1 99 0 0 0 0 1340 90852 0 253020 0 0 0 0 121 164 0 0 100 0 0 [root@localhost ~]#
    iostat: 统计CPU 和设备IO 信息
    示例:iostat 1 10
    pmap 命令:进程对应的内存映射
    写数字表示进程号,然后看内存映射信息
    /proc/1/masp #地址
    pmap [options] pid [...]
    -x: 显示详细格式的信息
    示例:pmap 1
    另外一种实现:
    cat /proc/PID/maps
    [root@localhost ~]# cat /proc/1/maps 
    7fd420000000-7fd420029000 rw-p 00000000 00:00 0 
    7fd420029000-7fd424000000 ---p 00000000 00:00 0 
    7fd42778b000-7fd42778c000 ---p 00000000 00:00 0 
    7fd42778c000-7fd427f8c000 rw-p 00000000 00:00 0 
    7fd427f8c000-7fd427f8d000 ---p 00000000 00:00 0 
    7fd427f8d000-7fd42878d000 rw-p 00000000 00:00 0 
    7fd42878d000-7fd428791000 r-xp 00000000 fd:00 67235606                   /usr/lib64/libuuid.so.1.3.0
    7fd428791000-7fd428990000 ---p 00004000 fd:00 67235606 
    
    
    [root@localhost ~]# pmap 1
    1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 21
    00007fd420000000    164K rw---   [ anon ]
    00007fd420029000  65372K -----   [ anon ]
    00007fd42778b000      4K -----   [ anon ]
    00007fd42778c000   8192K rw---   [ anon ]
    00007fd427f8c000      4K -----   [ anon ]
    00007fd427f8d000   8192K rw---   [ anon ]
    00007fd42878d000     16K r-x-- libuuid.so.1.3.0
    00007fd428791000   2044K ----- libuuid.so.1.3.0
    View Code

    dstat 命令:系统资源统计, 代替vmstat,iostat 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
    kill 命令:
    向进程发送控制信号,以实现对进程管理, 每个信号对应一个数字,
    信号名称以SIG 开头(可省略 ), 不 区分大小写
    显示当前系统可用信号: kill –l,trap -l
    常用信号:man 7 signal
    1) SIGHUP: 无须关闭进程而让其重读配置文件
    2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
    3) SIGQUIT: 相当于ctrl+
    9) SIGKILL: 强制杀死正在运行的进程 #不是什么进程都能杀死比如bash
    15) SIGTERM :终止正在运行的进程 #默认是15,有的进程这么杀不死
    18) SIGCONT :继续运行
    19) SIGSTOP :后台休眠
    #如果在后台运行的程序,用它也能进行休眠
    指定信号的方法:
    (1) 信号的数字标识:1, 2, 9
    (2) 信号完整名称:SIGHUP (3) 信号的简写名称:HUP
     
    按PID :kill [-SIGNAL] pid …
    kill –n SIGNAL pid;kill –s SIGNAL pid
    按名称:killall [-SIGNAL] comm…
    按模式:pkill [options] pattern
    -SIGNAL
    -u uid: effective user ,生效者
    pkill -9 -u wang
    -U uid: real user ,真正发起运行命令者
    -t terminal: 与指定终端相关的进程
    -l: 显示进程 名(pgrep 可用)
    -a: 显示完整格式的进程 名( (pgrep 可用)
    -P pid: 显示指定进程的子进程
     
     
    Linux 的作业控制
    前台作业:通过终端启动,且启动后一直占据终端;
    后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
    让作业运行于后台
    (1) 运行中的作业: Ctrl+z
    送到后台并休眠
    (2) 尚未启动的作业:# COMMAND &
    后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭
    后台作业。如果希望送往后台后,剥离与终端的关系
     
    nohup COMMAND & #screen;COMMAND
    送到后台运行不与终端有关
    默认是有输出的,可以重定向到垃圾箱
    nohup.out #结果这个文件下会有
    screen #新开终端,跟sshd没关系
    -ls 查看会话
     
     
    查看当前终端所有作业:
    jobs #这个只能在当前终端看当前终端的后台运行进程
    后台两种状态
    运行:
    休眠:stop
    作业控制:
    fg [[%]JOB_NUM] :把指定的后台作业调回前台
    bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行
    kill [%JOB_NUM]: 终止指定的作业
    kill %1 #结束编号作业,需要用jobs先查看
     
    对于任务的加速完成
     
    f1.sh;f2.sh;f3.sh #这是顺序执行达不到效果
    同时运行多个进程,提高效率
    方法1 #必须放入后台执行
    vi all.sh
    f1.sh&
    f2.sh&
    f3.sh&
    方法2
    (f1.sh&);(f2.sh&);(f3.sh&) #会开子进程
    方法3
    { f1.sh& f2.sh& f3.sh& }
     
     
    #at命令如果时间过了,会明天去执行
    包:at
    at 命令:at [option] TIME
    常用选项:
    -V 显示版本信息:
    -l: 列出指定队列中等待运行的作业;相当于atq
    -d: 删除指定的作业;相当于atrm
    -c: 查看具体作业任务
    -f /path/from/somefile :从指定的文件中读取任务
    -m: 当任务 被完成之后,将给用户发送邮件,即使没有标准输出
    注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
    TIME: 定义出什么时候进行 at 这项任务的时间
    HH:MM [YYYY-mm-dd]
    20:20 2016-10-10
    noon, midnight, teatime (4pm) #英文单词也能用
    tomorrow #明天
    now+#{minutes,hours,days, OR weeks}
    at now+10minutes #10分钟后自动执行
     
    HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
    HH:MM YYYY-MM-DD 02: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
    02pm + 3 days
     
    执行方式:
    1)交互式 )输入重定向 3 )at –f 文件
    依赖与atd 服务, 需要启动才能实现at 任务
    at 队列存放在/var/spool/at 目录中
    /etc/at.{allow,deny} 控制用户是否能执行at 任务
    白名单:/etc/at.allow 默认不存在,只有该文件中的用户
    才能执行at 命令
    黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行
    at 命令, 而没有在 在at.deny 文件中的使用 者则可执行
    如果 两个文件都不存在有 ,只有 root 行 可以执行 at
    /etc/at.deny
    wang
    mage
    /etc/at.allow
    #这个两个用户会因为写入这个文件而不能执行。
    #如果两个文件都写了该用户。白名单权限更高。设置白名单后,一切以白名单为主,如果这两个文件都没有,除了root全部拒绝
    例:
    [root@magedu6 ~]# cat /etc/rc.d/init.d/atd   #命令状态确认 CentOS 6
    #!/bin/sh
    #
    # atd Starts/stop the "at" daemon
    #
    # chkconfig:   345 95 5
    # description: Runs commands scheduled by the "at" command at the time 
    #    specified when "at" was run, and runs batch commands when the load 
    #    average is low enough.
    ...省略
    [root@magedu6 ~]# runlevel #确认是否启动
    3 5
    
    [root@magedu6 ~]# service atd status   #查看当前状态
    atd (pid  1913) 正在运行...
    
    [root@magedu6 ~]# chkconfig --list atd
    atd             0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭
    
    [root@localhost ~]# cat /lib/systemd/system/atd.service  #CentOS 7上的状态确认
    [Unit]
    Description=Job spooling tools
    After=syslog.target systemd-user-sessions.service
    
    [Service]
    EnvironmentFile=/etc/sysconfig/atd
    ExecStart=/usr/sbin/atd -f $OPTS
    ...
     
    [root@localhost ~]# systemctl is-enabled atd   #确认开机是否启动
    enabled
    
    [root@localhost ~]# systemctl status atd.service  #  #确认是否启动,.service可以省略
    ● atd.service - Job spooling tools
       Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
       Active: inactive (dead)
    
    
    [root@localhost ~]# at 09:28    #默认交互模式,echo这类终端打印 命令没打印的原因是他以邮件方式发送给root。只要标准输出命令都要输出到/dev/null避免太多垃圾邮件
    at> echo at is starting
    at> <EOT>
    job 3 at Wed May 10 09:28:00 2017
    
    [root@localhost ~]# at -l     #可以看到没执行的计划任务,相当于atq命令
    2       Wed May 10 09:24:00 2017 a root
    3       Wed May 10 09:28:00 2017 a root
    
    at命令关机也不会丢  因为会放在 /var/spool/at/... 文件里
    
    [root@localhost ~]# getent passwd daemon   #系统用户,查看情况
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    View Code
    at -d 4 #删除4这个计划任务
    atrm 5 #删除计划任务5
    at -c 7 #查看具体情况,就是看/var/spool/at这个文件
    at -f atjob #直接调用文件 和sed -f 里的效果差不多。
    at -m 14:34
    touch 1.log  
    周期性任务计划:cron
    相关 的程序包:
    cronie: 主程序包,提供crond 守护进程及相关辅助工具
    cronie-anacron :cronie 的补充 程序,用于 监控cronie任务执行 状况,如cronie 中的任务在过去该运行的时间点未能正常运行,则anacron 会随后启动一次此任务。
    crontabs :包含CentOS 提供系统维护任务
     
    chkconfig --list crond #查看启动没有
    service crond status #查看启动没有
    systemctl status crond #7上查看启动没有
    /usr/sbin/crond #真正的程序在这
    /var/spool/cron #你做的计划任务会在这
     
    确保crond 守护处于运行状态:
    CentOS 7:
    systemctl status crond
    CentOS 6:
    service crond status
    计划周期性执行的任务提交给crond ,到指定时间会自动运行
    系统cron 任务:系统维护作业
    /etc/crontab
    用户cron 任务:
    crontab 命令
    日志:/var/log/cron
     
    时间表示法:
    (1) 特定值
    给定时间点有效取值范围内的值
    (2) *
    给定时间点上有效取值范围内的所有值
    表示“每...”
    (3) 离散取值
    #,#,#
    4) 连续取值
    #-#
    (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 * * * *
    示例:每3 小时echo 和wall 命令
    0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall
    “welcome to Magedu!
     
    系统cron 任务:/etc/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
    例如:晚上9 点10 分运行echo 命令
    10 21 * * * centos /bin/echo "Howdy!"
    #写计划任务的时候必须写明确路径让文件知道在哪找,因为不一定用一个shell。
    例:
    30 2 1-10,20-25 root /bin/touch /app/cron.log #写普通用户也行,但普通用户不一定有资格
    * #*代表每分钟
    cp -a /etc/ /paa/etcbak-`date +%F`/ #复制一个文件,因为有%所以不会成功
    * * * * * root cron.sh #写入脚本调用就好,最后两个*是或,其他三个是并且。如果想实现并且,就脚本里写。
    @reboot root touch /app/reboot.log #重启后执行
     
    /var/spool/cron/ #用命令创建的才放到这里,文件里写入不存在
     
    系统的计划任务:
    /etc/crontab #可以修改文件达成,给管理员用的
    /etc/cron.d/ 配置文件 #和上面那个路径差不多
    /etc/cron.hourly/ 脚本
    #run-parts /etc/cron.hourly #去运行这个目录下所有脚本
    /etc/cron.daily/ 脚本
    /etc/cron.weekly/ 脚本
    /etc/cron.monthly/ 脚本
     
    anacron
    运行计算机关机时cron 不运行的任务,CentOS6 以后版本
    取消anacron 服务,由crond 服务管理
    对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其
    它不一直开机的系统很重要对很有用
    配置文件:/etc/anacrontab ,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly 中系统任务。
    • 字段1 :如果在这些日子里没有运行这些任务……
    • 字段2 :在重新引导后等待这么多分钟后运行它
    • 字段3 :任务识别器,在日志文件中标识
    • 字段4 :要执行的任务
    由/etc/cron.hourly/0anacron 执行
    当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳
     
    /usr/bin/on_ac_power #把电源拔了试试
     
    whatis rm #查看数据库里这个命令的
     
    #/etc/cron.daily
    logrotate #用来发现日志文件是否过大,过大会分割创建个文件,保证文件不会太大
    mandb #更新数据库 7上
    mlocate
     
    #ls /etc/cron.daily/ #脚本目录
    #cat /etc/cron.daily/tmpwatch #这个文件会自动清除一些临时文件
    CentOS6 使用/etc/cron.daily/tmpwatch 定时清除临时文件
    CentOS7 使用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 命令定义,每个用户都有专用的cron 任务文件:/var/spool/cron/USERNAME
    crontab 命令:
    crontab [-u user] [-l | -r | -e] [-i]
    -l: 列出所有任务 #默认只看自己的加-u才能看别人的
    -e: 编辑任务;
    #会创建个临时文件,不用写用户了
    cd /var/spool/cron/ #文件放在这
    -r: 移除当前用户所有任务
    -i :同-r 一同使用,以交互式模式移除指定任务
    -u user: 仅root 可运行,指定用户管理cron 任务
    控制用户执行计划任务 :
    /etc/cron.{allow,deny} #和at里的道理一样。 #默认也是没有allow,如果已经有了计划任务,还是会执行,因为改的是命令现在的权限了。
     
    #用这个命令修改后,会删除旧文件,生成新文件。
    export EDITOR=vim #使很多程序默认使用vim
    vipw 相当于/etc/passwd #有语法检查功能
    /var/log/cron #计划任务的日志。如果误删除在这找。
     
    一次性作业使用 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
    #没有被重定向的输出会被邮寄给用户
    #根用户能够修改其它用户的作业
     
    注意:运行结果的标准输出和错误以邮件通知给相关用户
    (1) COMMAND > /dev/null
    (2) COMMAND &> /dev/null
    对于cron 任务来讲,% 有特殊用途;如果在命令中要使用%,则需要转义,将%
  • 相关阅读:
    Linux如何编译安装源码包软件
    安装python发行版本,并用conda来管理Environments,Python,packages
    命令远程传输文件
    CentOS7更换yum源为阿里云镜像源
    CentOS安装pip并修改源为豆瓣源
    查看SELinux状态及关闭SELinux
    解决CentOS查询不到ip
    chmod变更文件或目录的权限
    开启HTML5之旅。。。
    JDK 动态代理的实现
  • 原文地址:https://www.cnblogs.com/songcheng/p/6828709.html
Copyright © 2011-2022 走看看