14Linux之系统管理

BamB00 2019-12-10 00:00:00
Categories: Tags:

0x01 进程管理

0x011 简介

  1. 进程

    进程(英语:process),是指计算机中已运行的程序。进程曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。

  2. 进程管理

0x012 查看进程

0x0121 ps

ps命令时用来静态显示系统中进程的命令。不过这个命令有些特殊,它的部分命令的选项不能加入- 比如 ps aux这是因为ps命令的部分选项需要遵守BSD操作系统格式。所以PS命令常用选项的组合是固定的。命令如下:

# ps aux
#查看系统中所有进程,使用BSD操作系统格式
# ps -ls
#查看系统中所有进程,使用Linux标准命令格式
选项:
    a: 显示一个终端的所有进程,除了会话引线
    u: 显示进程的归属用户及内存的使用情况
    x: 显示没有控制终端的进程

reahat7以下的版本ps aux加了ps -aux会报错7版本一下不会报错

-> # ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  4.7  0.6 128048  6640 ?        Ss   04:15   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 
root          2  0.0  0.0      0     0 ?        S    04:15   0:00 [kthreadd]
原称 意义
USER 该进程属于那个使用者账号的?
PID 该进程的进程ID号。
%CPU 该进程使用掉的 CPU 资源百分比
%MEM 该进程所占用的物理内存百分比
VSZ 该进程使用掉的虚拟内存量 (Kbytes)
RSS 该进程占用的固定的内存量 (Kbytes)
TTY 该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT 该程序目前的状态,主要的状态有 R :该程序目前正在运作,或者是可被运作;S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。T :该程序目前正在侦测或者是停止了 Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START 该进程被触发启动的时间;
TIME 该进程实际使用 CPU 运作的时间。
COMMAND 该程序的实际指令为什么?

0x0122 top

top 指令是动态刷新的跟Windows的任务管理器相同

top - 11:00:54 up 54 days, 23:35,  6 users,  load average: 16.32, 18.75, 21.04
Tasks: 209 total,   3 running, 205 sleeping,   0 stopped,   1 zombie
%Cpu(s): 29.7 us, 18.9 sy,  0.0 ni, 49.3 id,  1.7 wa,  0.0 hi,  0.4 si,  0.0 st
KiB Mem : 32781216 total,  1506220 free,  6525496 used, 24749500 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 25607592 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                  
root      20   0   15.6g 461676   4704 R 198.0  1.4  11:15.26 python                                                                                                                                                                   
root      20   0 9725596 240028   4672 R 113.0  0.7   7:48.49 python                                                                                                                                                                   
root      20   0 6878028 143196   4720 S  82.4  0.4   1:35.03 python

第一行数据相当于uptime命令输出。11:00:54是当前时间,up 54 days,23:55 是系统已经运行的时间,6 users表示当前有6个用户在登录,load average:16.32,18.75,21.04分别表示系统一分钟平均负载,5分钟平均负载,15分钟平均负载。

平均负载

平均负载表示的平均活跃进程数,包括正在running的进程数,准备running(就绪态)的进程数,和处于不可中断睡眠状态的进程数。如果平均负载数刚好等于CPU核数,那证明每个核都能得到很好的利用,如果平均负载数大于核数证明系统处于过载的状态,通常认为是超过核数的70%认为是严重过载,需要关注。还需结合1分钟平均负载,5分钟平均负载,15分钟平均负载看负载的趋势,如果1分钟负载比较高,5分钟和15分钟的平均负载都比较低,则说明是瞬间升高,需要观察。如果三个值都很高则需要关注下是否某个进程在疯狂消耗CPU或者有频繁的IO操作,也有可能是系统运行的进程太多,频繁的进程切换导致。比如说上面的演示环境是一台8核的centos机器,证明系统是长期处于过载状态在运行。

Tasks: 214 total,   4 running, 209 sleeping,   0 stopped,   1 zombie

第二行的Tasks信息展示的系统运行的整体进程数量和状态信息。214 total 表示系统现在一共有214个用户进程,4 running 表示4个进程正在处于running状态,209 sleeping表示209个进程正处于sleeping状态,0 stopped 表示 0 个进程正处于stopped状态,1 zombie表示 有1个僵尸进程。

僵尸进程

子进程结束时父进程没有调用wait()/waitpid()等待子进程结束,那么就会产生僵尸进程。原因是子进程结束时并没有真正退出,而是留下一个僵尸进程的数据结构在系统进程表中,等待父进程清理,如果父进程已经退出则会由init进程接替父进程进行处理(收尸)。由此可见,如果父进程不作为并且又不退出,就会有大量的僵尸进程,每个僵尸进程会占用进程表的一个位置(slot),如果僵尸进程太多会导致系统无法创建新的进程,因为进程表的容量是有限的。所以当zombie这个指标太大时需要引起我们的注意。下面的进程详细信息中的S列就代表进程的运行状态,Z表示该进程是僵尸进程。

消灭僵尸进程的方法:

1.找到僵尸进程的父进程pid(pstress可以显示进程父子关系),kill -9 pid,父进程退出后init自动会清理僵尸进程。(需要注意的是kill -9并不能杀死僵尸进程)

2.重启系统。

%Cpu(s): 31.9 us, 30.3 sy,  0.0 ni, 37.0 id,  0.0 wa,  0.0 hi,  0.8 si,  0.0 st

第三行的%Cpu(s)表示的是总体CPU使用情况。

所以整体的CPU使用率=1-id。当us很高时,证明CPU时间主要消耗在用户代码,需要优化用户代码。sy很高时,说明CPU时间都消耗在内核,要么是频繁的系统调用,要么是频繁的CPU切换(进程切换/线程切换)。wa很高时,说明有进程在进程频繁的IO操作,有可能是磁盘IO,也有可能是网络IO。si很高时,说明CPU时间消耗在处理软中断,网络收发包会触发系统软中断,所以大量的网络小包会导致软中断的频繁触发,典型的SYN Floor会导致si很高。

KiB Mem : 32781216 total,   663440 free,  7354900 used, 24762876 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 24771700 avail Mem

第4,5行显示的是系统内存使用情况。单位是KiB。totol 表示总内存,free 表示没使用过的内容,used是已经使用的内存。buff表示用于读写磁盘缓存的内存,cache表示用于读写文件缓存的内存。avail表示可用的应用内存。

Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用。Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的。这三个值都为0表示系统关闭了swap功能,由于演示环境是一台虚拟机,虚拟机一般都关闭swap功能。

第6行开始往后表示的是具体的每个进程状态:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 

top并不能看到系统中所有的经常,默认看到的是CPU占比考前的进程。如果我们想要看到所有进程可以把top命令的结果重定向到文件当中即可。不过Top命令是持续运行的,需要”-b”和“-n”选项

#top -b -n 1 > ./Top_log.log
命令只执行一次,然后让结果保存到Top_log.log中,这样就可以看到所有进程了。

0x0123 pstree

#pstree [选项]
选项:
    -p : 显示进程的PI
    -u : 显示进程的所属用户

0x013 进程管理

系统中可以识别的信号比较多,我们可以使用命令kill -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

常用的信号:

信号代号 信号名 含义 默认操作
1 SIGHUP 该信号在用户终端关闭时产生,通常是发给和该终端关联的会话内的所有进程 终止
2 SIGINT 该信号在用户键入INTR字符(Ctrl-C)时产生,内核发送此信号送到当前终端的所有前台进程 终止
3 SIGQUIT 该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-)来产生 终止
4 SIGILL 该信号在一个进程企图执行一条非法指令时产生 终止
8 SIGPIPE 当进程往一个没有读端的管道中写入时产生,代表“管道断裂” 终止
9 SIGKILL 该信号用来结束进程,并且不能被捕捉和忽略 终止
14 SIGALRM 该信号用于通知进程定时器时间已到 终止
18 SIGCONT 该信号让进程进入运行态 暂停进程
19 SIGSTOP 该信号用于暂停进程,并且不能被捕捉和忽略 暂停进程
20 SIGTSTP 该信号用于暂停进程,用户可键入SUSP字符(通常是Ctrl-Z)发出这个信号(当前终端的前台进程在后台挂起) 暂停进程

0x0131 kill

#kill -[信号] PID

注意: kill 后面只能加PID

例如

kill -9 534343

0x0132 killall -9

killall [选项] 名称
选项:
    -e : --exact 进程需要和名字完全相符
    -I : --ignore-case 忽略大小写
    -g : --process-group 结束进程组
    -i : --interactive 结束之前询问
    -l : --list 列出所有的信号名称
    -q : --quite 进程没有结束时,不输出任何信息
    -r : --regexp 将进程名模式解释为扩展的正则表达式。
    -s : --signal 发送指定信号
    -u : --user 结束指定用户的进程
    -v : --verbose 显示详细执行过程
    -w : --wait 等待所有的进程都结束
    -V : --version 显示版本信息
    --help 显示帮助信息

0x0133 pkill

pkill命令和kiallall命令非常相似。但他支持按照终端号杀死进程

# pill [选项] [信号] 进程命

0x02 工作管理

0x021 简介

后台管理有几个注意事项:

0x022 把命令放入到后台执行

方法 一 &

#命令 &

这种命令放在后台是以执行状态放入后台(交互指令除外如:vi top)

方法 二 在执行过程中按 ctrl + z 快捷键,命令在后台是暂停状态

使用这种方法放入后台的命令,就算是不和前台有交互,能在后台执行的命令,也是暂停状态,ctrl + z 快捷键就是暂停的快捷键。

0x023 后台管理命令

0x0231 查看后台的工作

#jobs [-l]
选项:
    -l : 显示工作的PID

0x0232 将后台暂停的工作恢复到前台执行

#fg %工作号
参数:
    %工作好: %可以省略,但注意工作号和PID的区别

0x0233 将后台暂停的工作恢复到后台继续执行

#bg %工作号

0x0234 后台命令脱离登录终端运行

​ 我们已经知道把命令放入后台,只能在当前登陆终端执行。那如果我是远程管理的服务器,在远程终端中执行了后台命令,这时,我退出登录,这个后台命令还能继续执行吗?当然是不行的。

​ 如果想要继续执行只能执行下面的方法

**方法 一 **

​ 把后台命令直接写入/etc/rc.local文件,让系统在启动时执行这个后台程序。这种方法的问题时,服务器不能随便重启,万一有临时后台任务,就不能执行。

方法 二

​ 第二种方法是使用系统定时任务,让系统再指定的时间执行某个后台命令,这样放入后台的命令与终端无关,是不依赖登录终端的。

方法 三

​ 最后一个方法是使用nohup命令

#nohup [命令] &

例如:
# nohup find / -print > ./file.log

0x03 系统资源查看

0x031 查看内存

0x0311 vmstat

vmstat命令的含义为显示虚拟内存状态(“Virtual Memory Statistics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。

#vmstat [选项] [刷新时间] [刷新次数]
选项:
    -a:显示活动内页;
    -f:显示启动后创建的进程总数;
    -m:显示slab信息;
    -n:头信息仅显示一次;
    -s:以表格方式显示事件计数器和内存状态;
    -d:报告磁盘状态;
    -p:显示指定的硬盘分区状态;
    -S:输出信息的单位。

Procs(进程)

Memory(内存)

Swap

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

0x0312 free

Linux free命令用于显示内存状态。

free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

free [-bkmotV][-s <间隔秒数>]

参数说明

              total        used        free      shared  buff/cache   available
Mem:           972M        175M        679M        7.6M        117M        664M
Swap:          2.0G          0B        2.0G

Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

0x032 查看硬件配置详细信息

所有硬件信息都放在/proc/下里面大部分都是硬件相关信息

root@localhost [09:19:41 AM] [/proc] 
-> # ls
1     1414  20   299  43   476   595  689  798   963        dma          keys        mpt           swaps
10    1419  21   30   44   477   6    691  8     acpi       driver       key-users   mtrr          sys
11    142   22   301  448  478   60   694  802   asound     execdomains  kmsg        net           sysrq-trigger
1153  1420  23   302  449  479   642  697  806   buddyinfo  fb           kpagecount  pagetypeinfo  sysvipc
1156  1429  24   31   45   480   643  7    807   bus        filesystems  kpageflags  partitions    timer_list
1158  15    274  318  459  481   644  700  809   cgroups    fs           loadavg     sched_debug   timer_stats
1163  1520  275  32   460  482   646  747  8279  cmdline    interrupts   locks       schedstat     tty
13    16    276  321  47   483   679  773  9     consoles   iomem        mdstat      scsi          uptime
1315  17    277  33   472  5     681  774  9191  cpuinfo    ioports      meminfo     self          version
1320  18    289  4    473  5098  682  777  9196  crypto     irq          misc        slabinfo      vmallocinfo
1321  19    292  41   474  561   683  788  9201  devices    kallsyms     modules     softirqs      vmstat
14    2     298  42   475  582   687  796  95    diskstats  kcore        mounts      stat          zoneinfo

/proc/cpuinfo文件

这个文件提供了有关系统CPU的多种信息

/proc/devices文件

这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。

/proc/meminfo文件

这个文件给出了内存状态的信息。它显示出系统中空闲内存,已用物理内存和交换内存的总量。它还显示出内核使用的共享内存和缓冲区总量。这些信息的格式和free命令显示的结果类似。

/proc/version文件

这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息。

0x033 查看用户登录信息

0x0331 w和who

w [-fhlsuV][用户名称]

参数说明

w  //显示当前用户,不显示登录位置
19:50:14 up 9:27, 4 users, load average: 0.31, 0.26, 0.18
USER   TTY   FROM       LOGIN@  IDLE  JCPU  PCPU WHAT
root   tty7   :0        Thu12  31:39m 10:10  0.60s gnome-session
root   pts/0  :0.0       17:09  2:18m 15.26s 0.15s bash
root   pts/1  192.168.1.17   18:51  1.00s 1.24s 0.14s -bash
root   pts/2  192.168.1.17   19:48  60.00s 0.05s 0.05s -bash

第一行显示系统的汇总信息,字段分别表示系统当前时间、系统运行时间、登陆哟内用户总数及系统平均负载信息。对于上述势力中的几个显示数据意义为:

2:13PM 表示执行W的时间是在下午2点31分。

11DAYS,81:18 表示系统运行11天零21小时18分。

4 USERS 表示当前系统登陆用户总数为4。

LOAD AVERAGE 与后面的数字一起表示系统在过去1,5,10分钟内的负载程度,数值越小,系统负载越轻。

从第二行开始构成一个表格,共有8个栏目,分别显示各个用户正在做的事情及该用户所占用的系统资料。

who信息更简单

root     pts/0        2019-12-12 09:07 (192.168.205.1)
root     pts/1        2019-12-12 09:07 (192.168.205.1)

0x0332 uptime

uptime是当前时间,系统已经运行了多久,多少用户连接目前正在使用系统,系统在过去1,5,15分钟内的平均负载。

#uptime
08:21:34 up 36 min,  2 users,  load average: 0.00, 0.00, 0.00

w部分和它是一样的看使用习惯

0x034 查看系统与内核信息

0x0341 uname

uname [选项]
[选项]:
    -a或--all  显示全部的信息。
    -n或-nodename  显示在网络上的主机名称。
    -r或--release  显示操作系统的发行编号。
    -s或--sysname  显示操作系统名称。
    -v  显示操作系统的版本。
    --help  显示帮助。
    --version  显示版本信息。

例子

# uname -a
Linux snail-hnlinux 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux

0x0342 lsb_release

lsb_release查看版本常用的只有一个就是

lsb_release -a 如果没有安装yum install -y lsb即可

#lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.7.1908 (Core)
Release:        7.7.1908
Codename:       Core

0x04 定时任务

0x041 一次性执行定时任务

0x0411 at服务管理

at命令想要正确执行,需要atd服务的支持。atd服务是独立的服务,所以启动命令是:

#service atd start

如果要让atd服务开机时自动启动,可以使用如下命令:

#chkconfig atd on

atd服务启动之后,at命令才可以正常使用,不过我们还要学习下at命令的访问控制。这里的访问控制指的是允许哪些用户使用at命令设定定时任务,或者不允许哪些用户使用at命令。

0x0412 at访问控制

at访问控制是设置成类黑白名单的设定。白名单是/etc/at.allow黑名单/etc/at.dent如果白名单和黑名单同时有同一个用户则允许使用,因为白名单的优先级更高

如果系统中没有at.allow那么,黑名单中的用户不能使用at命令,其他用户可以使用at命令。不过两个文件都对root无效

如果两个文件都没有只有root才可以使用at命令

Linux默认只有黑名单

0x0413 格式

#at [选项] 时间
选项:
    -m : 当at工作完成后,无论是否命令有输出,都用email通知执行at命令的用户
    -c 工作号 :显示at工作的实际内容
    + : + 时间就是以当前时间下几分钟后执行
时间:
    HH:MM  在指定的"小时:分钟"执行 如02:23
    HH:MM YYY-MM-DD 在指定的年月日时分执行
    HH:MM[am|pm] [month] [date] 在指定的"小时:分钟[上午|下午][月][日]"执行例如 02:30 july 25

0x042 循环执行定时任务

0x0421 Crond服务管理

crontab命令是需要crond服务支持的,crond服务同样是独立的服务,所以穷和自启动的方法一样。

#service crond restart

它和at类似,也有黑白名单,/etc/cron.allow/etc/cron.deny

约束条件同at

0x0422 用户的crontab设置

每个用户都可以实现自己的crontab定时任务,只要是使用这个用户身份执行 crontab -e命令即可,担任这个用户不能加入/etc/cron.deny文件中。

#crontab [选项]
选项:
    -e : 编辑crontab定时任务
    -l : 查询crontab任务
    -r : 删除当前任务的所有crontab任务,如果有多个任务,只想删除一个,这时候就需要"crontab -e"
    -u 用户名 : 修改或删除其他用户的crontab任务,只有root可用
修改配置文件比较多。

编写crontab任务

#crontab -e
* * * * * 执行命令

# 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

星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
小 结:
    数字的表示最好用2为阿拉伯数字显示
    周和日最好不要同时用
    定时任务要加注解
    可以定向到日志文件或者空文件
    定时任务一定是绝对路径,且目录必须存在才能出结果
    crontab 服务一定要开启运行

0x0423 crontab注意事项

0x0424 系统的crontab设置

修改系统的crontab设置的方法 一

crontab -e是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务。可是有些定时任务需要系统执行,这时候我们需要配编辑/etc/crontab这个配置文件了。当然,并不是说写入/erc/crontab配置文件中的定时任务执行时,不需要用户身份,而是/etc/crontab配置文件时,默认用户身份是当前用户。而修改/etc/crontab时,定时任务的执行着身份是可以手工指定的。这样定时任务的执行会更加灵活,修改起来也更加方便。

# vi/etc/crontab
SHELL=/bin/bash
//指定shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin
//环境变量Path crontab是使用自己的path,而不是系统默认的Path
MAILTO=root
//crond的任务执行信息将通过电子邮件发送给root用户
# 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

修改系统的crontab设置的方法 二

/usr/bin/run-parts 它会去读/etx/cron.*每个目录下的可执行文件全部执行一遍

#cat /etc/cron
cron.daily/      cron.hourly/   cron.monthly/     cron.weekly/ 

run-parts是以及写好的脚本

Centos6以下的版本,都是把批量定时任务写入到对应的每周每小时每天每月的文件夹下

Centos6及以上的版本都不需要那样配置

0x043 anacron检测定时任务

anacron 主要是用于防止系统宕机或者重启后没有执行定时任务设置的

他会在/var/spool/anacron/下存三个时间他会把上一次执行定时任务的时间放在里面。会同定时任务里的文件和系统时间作比较,看在宕机或者重启的时候有没有漏掉什么定时任务。

在Centos6以前的版本中/etc/cron.{daliy,weekly,monthly} cron和anacron都会调用三个文件但很容易出错,6版本及以后的版本只能anacron调用

因为很少去手动执行指令,所以只写配置文件/etc/anacrontab

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

RANDOM_DELAY=45
#随机最大延迟就是怕开机一起全部执行脚本会导致系统宕机,就会前一个执行脚本然后每个之间脚本之间的时间间隔。

START_HOURS_RANGE=3-22
#anacron 执行时间03:00-22:00


1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

以第一个语法解释

1       5       cron.daily              nice run-parts /etc/cron.daily
  1. 读取/var/spool/cron.daily中的时间
  2. 和当前时间做比较如果超过 1天则执行指令
  3. 这个工作只能在03:00-22:00执行
  4. 执行的工作时间强制时间为5分钟,然后再随机延迟0-45分钟
  5. 使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.dayly目录中的所有可执行文件。