1. 进程管理

1.1 后台管理

后台管理是进程管理的重要组成部分,允许用户将任务置于后台运行,从而释放前台资源供其他操作使用。

软件后台运行方法

软件后台运行方法描述应用场景
命令&将命令附加一个&符号,使其直接进入后台运行适用于大多数情况下的简单任务
nohup命令使用nohup命令可以让程序忽略挂断信号,即使用户登出也不会影响程序运行当需要记录输出到文件时非常有用,默认输出文件为nohup.out
Ctrl+Z + bg先按下Ctrl+Z暂停当前命令,再输入bg让其继续在后台执行对于那些无法通过Ctrl+C正常结束的任务特别有效
screen命令创建一个持久化的虚拟终端环境,提供更稳定的后台运行方式需要长时间运行的任务,如服务器部署

实例演示

sleep 999 &为例,这条命令会让sleep命令在后台运行999秒。通过jobs命令可以查看所有手动移至后台的任务列表,其中每个任务前面都有一个编号,表示这是第几个被移到后台的任务。例如:

[root@oldboy83-prod ~]# sleep 999 &
[1] 1728

这里[1]表示这是第一个被放到后台的任务,而1728则是该任务对应的进程ID(PID)。接下来可以通过ps aux | grep 1728验证这个进程是否真的进入了后台。

nohup命令详解

nohup命令不仅能让命令在后台运行,还能确保命令的输出不会因为终端关闭而丢失。默认情况下,输出会被重定向到名为nohup.out的文件中。如果希望将输出保存到另一个文件,可以通过重定向的方式指定输出路径。例如:

nohup ping baidu.com > lidao-new.txt &

这行命令会不停地向百度发送ICMP请求,并把结果保存到lidao-new.txt文件里。

screen命令介绍

screen是一个强大的工具,它可以创建一个持久化的虚拟终端环境,即使网络连接中断,命令也能继续运行。下面是如何使用screen的一个简单例子:

  1. 安装screen: yum install -y screen
  2. 启动一个新的screen会话: screen
  3. 在新窗口内执行任意命令,比如ping baidu.com
  4. 按下Ctrl+A然后按D键,暂时离开当前screen会话而不影响内部命令的执行
  5. 查看所有活动的screen会话: screen -ls
  6. 回归某个特定的screen会话: screen -r <session-id>
1.2 终止进程的命令

除了启动和管理进程外,了解如何安全地终止不必要或异常的进程同样重要。为此,介绍了三种常用的“杀手”命令——killpkillkillall

  • kill: 默认发送SIGTERM信号给指定的进程ID,要求进程正常终止。如果需要强制终止,则可以使用kill -9 <pid>发送SIGKILL信号。然而,对于数据库等关键应用,应谨慎使用kill -9,因为它可能导致数据损坏。
  • pkill: 根据进程名称模糊匹配来发送信号给多个符合条件的进程。这对于清理一批相似的服务非常有帮助。
  • killall: 类似于pkill,但它只匹配完全符合给定名称的进程。因此,在处理同名进程时更加精准。
1.3 负载管理

负载是指单位时间内系统处于可运行状态(R, S)和不可中断状态(D)的平均进程数,即活跃进程的数量。它是衡量系统繁忙程度的关键指标之一。

负载概述

  • 平均负载: 表示过去1分钟、5分钟和15分钟内的平均负载值。通常,这三个数值越接近CPU核心总数,表明系统的负载越高。
  • 预警阈值: 当负载达到CPU核心数的70%-80%时,建议采取预防措施以避免潜在的问题发生。
  • 恢复策略: 如果意外退出了screen会话,可以通过screen -r命令重新连接到之前的会话;若想彻底结束某次会话,则可以在screen内部按Ctrl+D

负载高时的排查流程

一旦监测到系统负载过高,需迅速判断是由CPU还是I/O引起的问题。具体步骤如下:

  • CPU高: 在top命令输出中观察us(用户占用CPU)和sy(系统占用CPU)的比例。如果这两个值很高,可能是某些进程占用了过多的CPU资源。此时可以使用ps aux命令过滤出占用CPU较高的进程。
  • I/O高: 若wa(IOWAIT,磁盘I/O等待时间)显著增加,则可能是因为磁盘I/O成为了瓶颈。这时可以借助iotop -o命令来定位造成I/O压力的具体进程。

高级排查技巧

对于复杂的情况,还可以使用诸如dd这样的命令模拟生成大文件,以便测试磁盘读写速度。例如:

dd if=/dev/zero of=/tmp/big bs=1M count=500

这段代码的意思是从/dev/zero设备中读取零字节流,每次读取1MB的数据块,总共复制500次,最终形成一个大约500MB大小的文件存放在/tmp/big位置。