天天看点

Linux系统管理——进程和计划任务

1、进程

    进程的管理是内核的重要功能之一,了解和熟练的完成进程管理是系统安全、性能效率优化的基础。

1.1、进程的性能及功能

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

进程的性质:

    Process:     
        运行中的程序的一个副本,是被载入内存的一个指令集合进程ID(Process ID,PID)号码被用来标记各个进程
        UID、 GID、和SELinux语境决定对文件系统的存取和访问权限;
    
        通常从执行进程的用户来继承;
        存在生命周期。      

1.2、进程的创建

    进程创建:
        init:第一个进程;上帝进程。
        进程之间存在父子关系。
    
    进程:
        都由其父进程创建,CoW(写时复制);
        fork(), clone()      

1.3、进程的基本状态与切换

Linux系统管理——进程和计划任务

进程的基本状态:

    创建状态:    
        进程在创建时需要申请一个空白PCB(process
        control block进程控制块),向其中填写控制和管理进程的信
        息,完成资源分配。如果创建工作无法完成,比如资源无法满
        足,就无法被调度运行,把此时进程所处状态称为创建状态;
    
    就绪状态:
        进程已经准备好,已分配到所需资源,只要分配到
        CPU就能够立即运行;
    
    执行状态:进程处于就绪状态被调度后,进程进入执行状态;
    
    阻塞状态:
        正在执行的进程由于某些事件(I/O请求,申请缓
        存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进
        入就绪状态等待系统调用;
    
    终止状态:
        进程结束,或出现错误,或被系统终止,进入终止
        状态。无法再执行;      

1.4、进程优先级

    系统优先级:
        数字越小,优先级越高;
        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)      

2、系统管理工具

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

2.1、pstree命令

pstree - display a tree of processes

[[email protected] ~]$pstree
init─┬─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     
[[email protected] ~]$pstree -p
init(1)─┬─abrtd(2237)
        ├─acpid(1698)
        ├─atd(2279)
        ├─auditd(1586)───{auditd}(1587)
        ├─console-kit-dae(2310)─┬─{console-kit-da}(2311)
        │                       ├─{console-kit-da}(2312)      

2.2、ps命令

ps: process state;
ps - report a snapshot of the current processes;      
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中;      
ps [OPTION]...
    支持三种选项:
        UNIX选项 如-A -e
        BSD选项 如a
        GNU选项 如--help      

常用选项:

选项:默认显示当前终端中的进程    
    • a 选项包括所有终端中的进程
    • x 选项包括不链接终端的进程
    • u 选项显示进程所有者的信息
    • f 选项显示进程树,相当于 --forest
    • k|--sort 属性 对属性排序,属性前加- 表示倒序
    • o 属性… 选项显示定制的信息 pid、 cmd、 %cpu、 %mem
    • L 显示支持的属性列表      
    -C cmdlist     指定命令,多个命令用,分隔
    -L 显示线程
    -e: 显示所有进程,相当于-A
    -f: 显示完整格式程序信息
    -F: 显示更完整格式的进程信息
    -H: 以进程层级格式显示进程相关信息
    -u userlist 指定有效的用户ID或名称
    -U userlist 指定真正的用户ID或名称
    -g gid或groupname 指定有效的gid或组名称
    -G gid或groupname 指定真正的gid或组名称
    -p pid 显示指pid的进程
    --ppid pid 显示属于pid的子进程
    -M 显示SELinux信息,相当于Z      

    输出属性:

        VSZ: Virtual memory SiZe    ,虚拟内存集,线性内存
        RSS: ReSident Size, 常驻内存集
        STAT:进程状态
            R:running
            S: interruptable sleeping
            D: uninterruptable sleeping
            T: stopped
            Z: zombie
            +: 前台进程
            l: 多线程进程
            L:内存分页并带锁
            N:低优先级进程
            <: 高优先级进程
            s: session leader,会话(子进程)发起者
        ni: nice值
        pri: priority 优先级
        psr: processor CPU编号
        rtprio: 实时优先级      
示例:
    ps axo pid,cmd,psr,ni,pri,rtprio      
常用组合:
    aux
    -ef
    -eFH
    -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
    axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm      

2.2.1、示例

查询你拥有的所有进程:
ps -x
显示指定用户名(RUID)或用户ID的进程:
ps -fU apache
ps -fu 48
显示指定用户名(EUID)或用户ID的进程:
ps -fu wang
ps -fu 1000
查看以root用户权限(实际和有效ID)运行的每个进程:
ps -U root -u root
列出某个组拥有的所有进程(实际组ID:RGID或名称):
ps -fG nginx

列出有效组名称(或会话)所拥有的所有进程:
ps -fg mysql
ps -fG 27
通过进程ID来显示所属的进程:
ps -fp 1234
以父进程ID来显示其下所有的进程,如显示父进程为1154的
所有进程:
ps -f --ppid 1234
显示指定PID的多个进程:
ps -fp 1204,1239,1263
要按tty显示所属进程:
ps -ft pst/0

以进程树显示系统中的进程如何相互链接:
ps -e --forest
以进程树显示指定的进程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
要显示一个进程的所有线程,将显示LWP(轻量级进程)以及
NLWP(轻量级进程数)列:
ps -fL -C nginx
要列出所有格式说明符:
ps L
查看进程的PID,PPID,用户名和命令:
ps -eo pid,ppid,user,cmd

自定义格式显示文件系统组,ni值开始时间和进程的时间:
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
使用其PID查找进程名称:
ps -p 1244 -o comm=
要以其名称选择特定进程,显示其所有子进程
ps -C sshd,bash
查找指定进程名所有的所属PID,在编写需要从std输出或文
件读取PID的脚本时这个参数很有用:
ps -C httpd,sshd -o pid=
检查一个进程的执行时间
ps -eo comm,etime,user | grep nginx


查找占用最多内存和CPU的进程:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem |
head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
显示安全信息:
ps -eM
ps --context
使用以下命令以用户定义的格式显示安全信息。
ps -eo euser,ruser,suser,fuser,f,comm,label
使用watch实用程序执行重复的输出以实现对就程进行实时的
监视,如下面的命令显示每秒钟的监视:
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-
%mem | head'      

2.2.2、进程优先级

进程优先级调整:
    静态优先级:100-139
    进程默认启动时的nice值为0,优先级为120
    只有根用户才能降低nice值(提高优先性)      
nice命令:
    nice [OPTION] [COMMAND [ARG]...]
renice命令:
    renice [-n] priority pid...
查看:
    ps axo pid,comm,ni      

2.2.3、搜索进程

最灵活:ps 选项 | 其它命令
按预定义的模式:pgrep
    pgrep [options] pattern
    -u uid: effective user,生效者
    -U uid: real user,真正发起运行命令者
    -t terminal: 与指定终端相关的进程
    -l: 显示进程名
    -a: 显示完整格式的进程名
    -P pid: 显示指定进程的子进程
按确切的程序名称:/sbin/pidof
    pidof bash      

2.3、系统工具uptime

显示当前时间,系统已启动的时间、当前上线人数,系统平
均负载(1、 5、 10分钟的平均负载,一般不会超过1)      
系统平均负载:
    指在特定时间间隔内运行队列中的平均进程数;

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

如果linux主机是1个双核CPU,当Load Average 为6的
时候说明机器已经被充分使用;      
[[email protected] ~]$uptime
 14:30:06 up  4:32,  3 users,  load average: 0.00, 0.00, 0.00      

2.4、进程管理工具top

top:有许多内置命令:
    排序:
        P:以占据的CPU百分比,%CPU
        M:占据内存百分比,%MEM
        T:累积占据CPU时长,TIME+
    首部信息显示:
        uptime信息:l命令
        tasks及cpu信息:t命令
        cpu分别显示:1 (数字)
        memory信息:m命令
    退出命令:q
    修改刷新时间间隔:s
    终止指定进程:k
    保存文件:W      
    栏位信息简介    
        us:用户空间
        sy:内核空间
        ni:调整nice时间
        id:空闲
        wa:等待IO时间
        hi:硬中断
        si:软中断(模式切换)
        st:虚拟机偷走的时间      
选项:
    -d #: 指定刷新时间间隔,默认为3秒
    -b: 全部显示所有进程
    -n #: 刷新多少次后退出      
[[email protected] ~]$top
top - 14:30:37 up  4:32,  3 users,  load average: 0.00, 0.00, 0.00
Tasks: 157 total,   1 running, 156 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004112k total,   597308k used,   406804k free,    88384k buffers
Swap:  1048572k total,        0k used,  1048572k free,   206356k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                    
  2107 mysql     20   0  988m 161m 5384 S  0.3 16.5   0:16.95 mysqld                                      
  3210 root      20   0 15036 1272  944 R  0.3  0.1   0:00.01 top                                         
     1 root      20   0 19348 1556 1236 S  0.0  0.2   0:01.52 init      
扩展:
    htop命令:EPEL源
    选项:
        -d #: 指定延迟时间;
        -u UserName: 仅显示指定用户的进程
        -s COLUME: 以指定字段进行排序
    子命令:
        s: 跟踪选定进程的系统调用
        l: 显示选定进程打开的文件列表
        a:将选定的进程绑定至某指定CPU核心
        t: 显示进程树      

2.5、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: 显示内存的统计数据      
[[email protected] ~]$vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 406804  88384 206392    0    0     4     1   10   14  0  0 100  0  0	      
[[email protected] ~]$vmstat -s
      1004112  total memory
       595632  used memory
       336248  active memory
       147916  inactive memory
       408480  free memory
        88384  buffer memory
       206428  swap cache
      1048572  total swap      

2.6、iostat命令

iostat:统计CPU和设备IO信息

示例:iostat 1 10      
[[email protected] ~]$iostat
Linux 2.6.32-696.el6.x86_64 (rootdns) 	01/21/2018 	_x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.06    0.17    0.00   99.76

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.66        29.84         9.79     536260     175890
scd0              0.01         0.64         0.00      11488          0
dm-0              0.06         0.96         0.05      17298        848      

2.7、pmap命令

    pmap命令:进程对应的内存映射;
    
    pmap [options] pid [...]
    -x: 显示详细格式的信息
    示例:pmap 1
    
    另外一种实现:
    cat /proc/PID/maps      
[[email protected] ~]$pmap 1797
1797:   /usr/sbin/sshd
00007f286e56c000     52K r-x--  /lib64/libnss_files-2.12.so
00007f286e579000   2044K -----  /lib64/libnss_files-2.12.so
00007f286e778000      4K r----  /lib64/libnss_files-2.12.so
00007f286e779000      4K rw---  /lib64/libnss_files-2.12.so
00007f286e77a000     28K r-x--  /lib64/librt-2.12.so
00007f286e781000   2044K -----  /lib64/librt-2.12.so      
[[email protected] ~]$pmap -x  1797
1797:   /usr/sbin/sshd
Address           Kbytes     RSS   Dirty Mode   Mapping
00007f286e56c000      52       0       0 r-x--  libnss_files-2.12.so
00007f286e579000    2044       0       0 -----  libnss_files-2.12.so
00007f286e778000       4       4       4 r----  libnss_files-2.12.so
00007f286e779000       4       4       4 rw---  libnss_files-2.12.so
00007f286e77a000      28       0       0 r-x--  librt-2.12.so
00007f286e781000    2044       0       0 -----  librt-2.12.so      

2.8、glances命令

EPEL源

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-Ppassword] [--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
    i Sort 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 hddtemp stats      
常用选项:
    -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:要连入的服务器端地址      

2.9、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相关的统计数据
    --tcp
    --udp
    --unix
    --raw
    --socket
    --ipc
    --top-cpu:显示最占用CPU的进程
    --top-io: 显示最占用io的进程
    --top-mem: 显示最占用内存的进程
    --top-latency: 显示延迟最大的进程      

2.10、iotop

iotop命令是一个用来监视磁盘I/O使用状况的top类工具。

iotop具有与top相似的UI,其中包括PID、用户、 I/O、进程

等相关信息。可查看每个进程是如何使用IO

交互按键:
    left和right方向键:改变排序
    r:反向排序
    o:切换至选项--only
    p:切换至--processes选项
    a:切换至--accumulated选项
    q:退出。
    i:改变线程的优先级      
[[email protected] ~]$iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                    
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
    8 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/1]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
   10 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/1]      

2.11、kill命令

    向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,    
    信号名称以SIG开头(可省略),不区分大小写;
    
    显示当前系统可用信号: kill –l,trap -l
    常用信号:man 7 signal      
[[email protected] ~]$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) 信号的数字标识: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,生效者
    -U uid: real user,真正发起运行命令者
    -t terminal: 与指定终端相关的进程
    -l: 显示进程名(pgrep可用)
    -a: 显示完整格式的进程名(pgrep可用)
    -P pid: 显示指定进程的子进程      

3、任务计划

    Linux任务计划、周期性任务执行未来的某时间点执行一次任务;
    
    at:一次性任务计划;
    batch:系统自行选择空闲时间去执行此处指定的任务周期性运行某任务;
    cron:系统计划任务,或者用户任务计划;      

3.1、at

包:at
 at命令:at [option] TIME
 常用选项:
-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出      
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户      
执行方式:
    1)交互式 2)输入重定向 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 命令      

3.2、cron

周期性任务计划:cron

相关的程序包:

    cronie: 主程序包,提供crond守护进程及相关辅助工具;
    cronie-anacron:
        cronie的补充程序,用于监控cronie任务执行状况,
        如cronie中的任务在过去该运行的时间点未能正常
        运行,则anacron会随后启动一次此任务;
        
    crontabs:包含CentOS提供系统维护任务      
确保crond守护处于运行状态:
    CentOS 7:
    systemctl status crond
    CentOS 6:
    service crond status
    
计划周期性执行的任务提交给crond,到指定时间会自动运行
系统cron任务:系统维护作业
    /etc/crontab

用户cron任务:
    crontab命令

日志:/var/log/cron      
详情参见 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

例如:晚上9点10分运行echo命令
10 21 * * * 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/脚本      

转载于:https://blog.51cto.com/mjunetwslinux/2067441