# 系统管理篇(3)- 进程管理

# 一、进程监控

# 1. 进程查看

进程概念

  • 运行中的程序,从程序开始运行到终止的整个生命周期是可管理的
  • 终⽌的⽅式并不唯⼀,分为正常终⽌和异常终⽌
    • 正常终⽌也分为从 main 返回、调⽤ exit 等⽅式
    • 异常终⽌分为调⽤ abort、接收信号等

进程查看命令

  • ps

    ps # 当前终端中的进程,PID 为进程的唯一标识
    ps -e | more # 所有进程,centos7 的 1 号进程是 systemd,而 centos6 为 init
    ps -ef | more # UID 为进程的有效用户 id(不一定是创建者),PPID 为父进程的 PID
    ps -eLf | more # LWP 线程

    当计算机资源不足时,可以查看是否是进程过多或线程过多导致的。

  • pstree

    # 默认没有安装,需要先安装
    yum install -y psmisc
    pstree | more
  • top

    top
    # up 33min - 上次开机后已经运行时间
    # load average: 0.04 0.05 0.06 - 1,5,15 分钟平均负载,可以把负载 1 想象成一个塞满的车道
    # Tasks - 运行的进程
    # % Cpu (s) - us 用户态,sy 系统态(进程间状态交互),id 空闲态,wa 等待磁盘操作。按数字 1 可以分别看逻辑 cpu
    # KiB Mem - 内存使用情况
    # KiB Swap - swap 使用情况
    top -p PID
  • 总结:进程也是树形结构;进程和权限有着密不可分的关系

# 2. 内存查看

常用命令介绍

  • free

    free -m
    free -mh
  • top

    top 
    top -p PID

# 二、进程控制

# 1. 进程优先级

  • nice

    • 范围从 - 20 到 19,值越小优先级越高,抢占资源就越多
    # 运行提供的脚本
    nice -n 10 ./loop.sh
  • renice

    • 重新设置优先级
    renice -n 15 PID

# 2. 进程的作业控制

  • & 符号

    # 后台运行提供的脚本
    ./loop.sh &
  • jobs

    jobs
    # 切换后台进程到前台
    fg [JOB_ID] # JOB_ID 为 jobs 命令查看到的作业 id
    # 切换前台进程到后台,在内存中挂起
    ctrl + z
    # 恢复前台执行
    jobs
    fg [JOB_ID]
    # 恢复后台执行
    jobs
    bg [JOB_ID]

# 3. 进程间通信

  • 信号是进程间通信⽅式之⼀,典型⽤法是:终端⽤户输⼊中断命令,通过信号机制 停⽌⼀个程序的运⾏。
  • 使⽤信号的常⽤快捷键和命令
  • kill -l
    • SIGINT 通知前台进程组终⽌进程 ctrl + c
    • SIGKILL ⽴即结束程序,不能被阻塞和处理 kill -9 pid

# 三、系统日志

# 1. 守护进程

  • 使⽤ nohup 与 & 符号配合运⾏⼀个命令

    • nohup 命令使进程忽略 hangup(挂起)信号,即关掉终端也不会结束进程

      nohup tail -f /var/log/messages &
  • 守护进程 (daemon) 和⼀般进程

    • 随 Linux 开机自动启动
    • 无需终端启动
    • 只占用根目录
    • 日志输出到系统日志中
    cd /proc/PID
    ls -l CWD
    ls -l FD

# 2. 系统日志

  • 常见的系统日志
    • /var/log
    • message
    • cron
    • secure

# 四、服务管理程序

# 1. 服务基本概念

服务(提供常⻅功能的守护进程)集中管理⼯具

# 2. service

  • 启动脚本位置 /etc/init.d/

# 3. systemctl

  • systemctl 常⻅操作

    • systemctl start | stop | restart | reload | enable | disable 服务名称

    • 软件包安装的服务单元 /usr/lib/systemd/system/

    • systemctl 的服务配置

      位置 /usr/lib/systemd/system/

    • 案例:loop 脚本开机自动启动

    cd /usr/lib/systemd/system/
    vi loopd.service # 通常可以复制 sshd.service 修改
    [Unit]
    Description=Loop service
    After=network.target
    [Service]
    Type=simple # Daemon 进程使用 forking
    User=root
    WorkingDirectory=/root
    ExecStart=/bin/bash /root/loop.sh
    ExecStop=/usr/bin/kill -s QUIT $MAINPID
    ExecReload=/usr/bin/kill -s HUP $MAINPID
    [Install]
    WantedBy=multi-user.target
    systemctl start loopd
    systemctl stop loopd
    systemctl enable loopd