proc目录
/proc目录是由Linux内核生成的虚拟文件目录,用来向用户以文件形式提供一种动态访问内核数据和系统信息的接口,,该目录下的大部分文件大小通常显示为0(占用内存空间),文件内容随着系统状态实时变化,在读取时会实时返回数据。该目录下大部分文件内容的字段分隔符为NUL字符\0,因此在读取文件内容时推荐使用命令cat 文件名 | tr ‘\000’ ‘ ‘来使用空格替换\0
/proc/<pid>
在proc目录下,每个正在运行的进程都有一个以pid为目录名的伪文件系统目录,里面包含了一些进程相关的文件,以下是部分文件包含的信息:
基本信息
- cmdline启动该进程时的完整命令行参数,内容以NUL字符分隔
- comm进程的命令名,最多显示16字节
- environ进程的环境变量,内容以NUL字符分隔
- cwd符号链接,指向进程的当前工作目录
- exe符号链接,指向正在运行的可执行文件
- root符号链接,进程所看到的根目录,受chroot影响
进程状态与资源
- status以人类可读形式显示进程信息,包括大部分stat文件和statm文件的信息,包括:
- Name:进程名,最长显示16个字符
- Umask:该进程创建文件或目录时的umask值
- State:进程状态(R运行、S睡眠、Z僵尸、D磁盘睡眠、T进程暂停、t停止追踪、X终止)
- Tgid,Ngid,Pid,PPid,TracerPid:分别为线程组ID,命名空间组ID(Namespace Group ID,在非命名空间环境中为0),进程ID,父进程ID,追踪此进程的进程ID(如果没有则为0)
- Uid,Gid:一共有4个字段,分别表示RUID(Real UID,进程实际启动者/拥有者)、EUID(Effective UID,进程当前拥有的权限,可以通过setuid设置临时提权,如:执行passwd命令将拥有root权限)、SUID(Saved UID,保存初始的 EUID,用于权限恢复)、FSUID(Filesystem UID,用于读写文件时文件系统访问权限检查),Gid类似
- FDSize:进程可以打开的文件描述符数量上限
- Groups:进程所属的附加组ID
- NStgid,NSpid,NSpgid,NSsid:分别表示进程在各PID命名空间中的线程组ID,线程ID,进程组ID,会话ID,主要用于容器技术
- Kthread:进程是否是内核线程(1是,0否)
- VmPeak,VmSize,VmLck,VmPin,VmHWM,VmRSS:分别表示进程启动以来所占用的虚拟内存峰值,当前占用虚拟内存总量,进程锁定的物理内存(不会被交换到swap),进程固定的物理内存,进程自启动以来占用的物理内存峰值,进程当前占用的物理内存(不包括swap)
- RssAnon,RssFile,RssShmem:进程占用的匿名内存,进程占用的文件映射内存的物理内存大小,进程占用的共享内存的物理内存大小
- VmData,VmStk,VmExe,VmLib,VmPTE,VmSwap:进程数据段占用的虚拟内存大小,进程栈占用的虚拟内存大小,进程可执行代码占用的虚拟内存大小,进程加载的共享库占用的虚拟内存大小,进程页表项(管理虚拟内存映射的开销)占用的内存大小,进程被交换到 Swap 分区 的内存大小
- 更多信息参考文档
- stat:类似于status文件,包含大量进程信息,一共有52个字段,每个字段空格分隔,该文件不会标注每个字段的含义,因此适合脚本分析,这些字段依次代表:进程ID、可执行文件名(括号包裹以避免文件名本身包含空格)、进程状态、父进程ID、进程组ID、会话ID、进程所连接的tty的设备号(没有则为0),前台进程组ID(与tty关联),进程的任务标志,进程累计的次缺页数,子进程的次缺页数,该进程累计的主缺页数,子进程的主缺页数,进程在用户态运行的时间(单位jiffies),进程在内核态运行的时间(单位 jiffies),已死去子进程的用户态时间总和,已死去子进程的内核态时间总和,动态优先级(不是nice值,内核内部特有表示方法,通常是20+nice),nice值,线程数,itrealvalue(已废弃始终为0),进程启动时间(单位jiffies,进程在自系统启动以来n个tick数时启动),虚拟内存大小(字节),驻留内存页数,内存使用上限(字节),程序可执行代码段的起始地址,程序可执行代码段的结束地址,栈的起始地址,当前 ESP(内核栈指针),当前 EIP(指令指针),待处理信号的位图,被屏蔽的信号位图,被忽略的信号位图,被捕捉的信号位图,进程在睡眠时的内核函数地址,已换出的页数,子进程换出的页数,线程在退出时向父进程发送的信号,最后执行该进程的CPU核心号,实时优先级(0表示普通进程),调度策略,在等待IO完成时消耗的时间,客户CPU时间,子进程的客户CPU时间,数据段起始地址,数据段结束地址,brk系统调用堆的起始地址,命令行参数起始地址,命令行参数结束地址,环境变量起始地址,环境变量结束地址,进程的退出代码
- statm:进程内存使用情况
- limits:进程当前的资源限制,比如最大打开文件数、最大堆栈大小等
- sched:调度器相关信息(调度策略、优先级、时间片消耗等)
- io:进程的 I/O 统计信息,比如读写的字节数
- maps:显示进程的内存映射情况
- mem:进程虚拟内存,可以用来读写进程内存
- fd目录:包含指向进程打开的所有文件描述符的符号链接
- task目录:该进程下所有线程的子目录,每个线程有类似 /proc/<tid>的结构
- mounts:进程看到的挂载点信息
- cgroup:进程所属的 cgroup 信息
其余部分子文件的作用
硬件信息
- cpuinfoCPU 详细信息(型号、核心数等)
- meminfo内存使用情况(总量、空闲、缓存等)
- partitions磁盘分区信息
- mounts已挂载的文件系统
内核参数与配置
- sys目录该目录下包含一些可修改的系统参数文件(可以使用sysctl命令修改或直接修改文件),如:/proc/sys/kernel/hostname用来修改主机名
- version内核版本和编译信息
- uptime第一个字段为系统总运行时间(秒),第二个字段为CPU空闲时间(秒)
- interrupts中断请求统计
- modules已加载的内核模块
进程管理
ps查看进程
该命令来自procps-ng包
- ps aux 使用BSD(unix)标准格式显示进程
- a 显示所有前台进程
- x 显示所有后台进程
- u 显示进程由哪个用户产生
- -l 显示详细信息
- -e 显示所有进程
- -C命令 显示指定命令的状态
pstree查看进程树
pstree [选项]
- -p 显示进程PID
- -u 显示进程所属用户
pgrep快速查找PID
pgrep [选项] 进程名(可以使用正则表达式)
- 默认情况下,命令只返回进程PID(适合在脚本中使用),默认匹配方式为部分匹配(sh会匹配到sh、sshd、bash等),精确匹配请使用-x,普通用户仅能匹配属于自己的进程,root可以匹配所有进程
- -l 同时输出进程名和PID
- -u 用户名:按用户名过滤进程
- -x 精确匹配完整进程名
- -f 匹配完整的命令行,包括命令路径、参数
- -n 只显示最新的进程
- -o 只显示最旧的进程
- -c 返回匹配的进程数量,不显式PID
- -d 分隔符:指定输出信息的分隔符,默认为换行符
- -i 忽略大小写
lsof查看进程调用的文件
lsof [选项]
- -c 字符串 只列出以字符串开头的进程打开的文件
- -u 用户名 只列出某个用户所启动进程打开的文件
- -p pid 只列出某个PID进程打开的文件
top监控系统资源占用状态
top [选项]
- -d 秒数:指定每几秒更新系统状态,默认是3秒
- -n 次数:在刷新指定次数后退出
- -b 批处理模式,通常用来将输出写入文件或交给其他程序处理,top会一次性输出信息,通常搭配-d和-n使用
- -p pid1,pid2…:查看指定进程的资源使用情况
- -u 用户名或ID:查看用户名下进程的资源使用情况
- -
- -H 显示线程而非进程资源,可以在运行后按H切换
- -c 显示进程的完整调用命令,而仅非名称,top执行后可以按c切换两种显示方式
- -i 忽略闲置(idle)和僵尸(zombie)进程
- -o %字段名:按字段名排序显示的信息,如 %CPU、%MEM、RES 等
- 在运行时切换信息显示方式:
- ?或h 显示交互帮助
- P 根据CPU占用率显示进程顺序,默认
- M 根据内存占用率显示进程顺序
- N 根据PID显示进程顺序
- q 退出top监控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 51704 4948 3660 S 0.0 1.0 10:45.34 systemd
| 内容 | 说明 |
|---|---|
| 15:40:11 | 系统当前时间 |
| up 41 days,15:45 | 系统运行时间,已运行41天15小时45分 |
| 2 users | 当前登录用户数量 |
| load average: 0.04, 0.05, 0.01 | 系统在1分钟、5分钟、15分钟前的平均负载,根据主机内核数量判断负荷情况,如 8核,超过8表明已超负荷运行 |
| Tasks | Tasks后分别为 系统中的总进程数、正在运行的进程、睡眠进程、停止的进程、僵尸进程 |
| %Cpu(s) | us为CPU被用户占用的比率,sy为系统占用比例,ni为修改过优先级的用户进程CPU占用比率,id为CPU空闲的比率,wa为等待输入、输出的进程占用CPU的比率,hi为硬中断请求服务占用CPU比率,si为软中断请求服务占用CPU比率,st为有虚拟机时,虚拟CPU等待实际CPU的时间百分比 |
| Mem | 物理内存总大小、空闲内存大小、使用内存大小、正在缓冲的内存大小 |
| Swap | 交换分区总大小、空闲部分、使用部分、有效大小 |
vmstat按指定次数监控系统资源
vmstat 刷新延迟 监听次数
输出进程数、内存状态、交换分区状况、硬盘输入输出状况、CPU状态
free查看内存信息
free [参数]
- -b 以字节单位显示内存大小
- -k 以KB单位显示内存大小(默认)
- -m 以MB单位显示内存大小
- -g 以GB单位显示内存大小
中止进程
系统信号
kill -l查询可用的进程信号(选项为L的小写字母非I)
Linux定义了64种信号,这些信号可由用户发起,也可由操作系统发起,信号在使用时可以使用其编号,也可以使用其名称,也可以是去除了SIG前缀的信号名,以下为部分信号的作用:
| 代号 | 名称 | 说明 |
|---|---|---|
| 0 | 不发送有效信号,仅用来测试进程是否存在,以及用户是否有权限向该进程发送信号 | |
| 1 | SIGHUP | 挂起进程,常用于通知进程重新加载配置文件或重启 |
| 2 | SIGINT | 中断进程(可通过ctrl+C发起),常用于进程执行到一半中途停止,该信号可以被捕获 |
| 3 | SIGQUIT | 退出进程(可通过Ctrl+\发起),并保存进程当前的内存映像生成core文件,用于调试 |
| 4 | SIGILL | 非法指令,表示进程可能在试图执行一个不符合操作系统或CPU架构规范的指令 |
| 5 | SIGTRAP | 跟踪/断点陷阱,通常用于在设置断点进行调试时,将进程设为跟踪模式 |
| 6 | SIGABRT | 异常终止,表示进程发生了致命错误导致进程终止 |
| 7 | SIGBUS | 总线错误,表示进程尝试执行无效的内存访问(如:尝试写入只读内存) |
| 8 | SIGFPE | 浮点异常,表示进程执行了错误的浮点运算,如除以零或结果超出浮点数表示范围等 |
| 9 | SIGKILL | 强制终止进程,进程将被立即终止而不给予进程保存文件、写入日志等操作时间,该信号无法被捕获 |
| 10 | SIGUSR1 | 用户自定义信号1 |
| 11 | SIGSEGV | 段错误 |
| 12 | SIGUSR2 | 用户自定义信号2 |
| 13 | SIGPIPE | 写到已关闭的管道 |
| 14 | SIGALRM | 闹钟 |
| 15 | SIGTERM | 正常终止进程,kill命令的默认信号,进程将被允许进行保存文件等操作后正常退出,该信号可以被捕获 |
| 16 | SIGSTKFLT | 栈溢出 |
| 17 | SIGCHLD | 子进程结束 |
| 18 | SIGCONT | 继续停止的进程执行,即恢复通过信号19和20所暂停的进程执行 |
| 19 | SIGSTOP | 强制暂停进程,由系统层面发出,该信号无法被捕获 |
| 20 | SIGTSTP | 暂停进程(可通过Ctrl+Z发起)并放到后台,可以通过fg命令将其恢复到前台继续执行,或通过bg命令在后台继续执行,该信号可以被捕获 |
kill向进程发送信号
kill [-信号] [进程PID1,PID2…]
- 默认情况下,如果不指定信号,命令将发送SIGTERM(15)信号
- 信号可以使用代号形式,也可以使用信号名形式,也可以是去除了SIG前缀的信号名形式
- -s 信号:指定信号,该选项可以直接缩写为-信号形式,该选项完整形式为--signal 信号
- -l [信号]:默认查看所有信号,如果指定了信号则只输出该信号的信号名或信号代号
- 不同的PID值,kill命令有不同作用:
- 如果PID为正值,则将信号发送给该PID对应的进程
- PID为0,则信号会被发送给所有与当前shell或进程同属一个进程组的所有进程,这通常用于终止与当前进程或脚本有关的所有进程,而不仅仅是一个单一的进程
- PID为-1,则信号会被发送给所有当前用户有权限发送的进程。对于普通用户,信号会被发送给该用户有权控制的所有进程,对于root用户,这可能会影响系统的所有进程!,一次性关闭所有进程,应当谨慎使用
- PID为-1以外的负值,信号会被发送给所有进程组ID(PGID)=|PID|(绝对值)的进程组中的所有进程
killall命令
killall [参数][信号代号] [进程名] 根据进程名中止进程
- -i 询问是否杀死某进程
- -I 忽略进程名大小写
pkill命令
pkill [参数][信号代号] [进程名]
- -t 终端号 按终端号关闭用户的连接(踢出用户)
虚拟内存
在Linux中,可以通过创建和启用交换空间(Swap)来添加虚拟内存,以缓解内存压力,避免内存不足时,进程直接被OOM Killer杀死,导致服务不可用。
创建虚拟内存
Linux中创建和启用虚拟内存需要依次执行以下步骤:
- 创建虚拟内存文件
- 格式化该文件
- 启用文件作为虚拟内存使用
1.检查当前的内存、磁盘、swap使用情况
Filesystem Size Used Avail Use% Mounted on
tmpfs 178M 1.2M 177M 1% /run
/dev/vda1 40G 13G 26G 33% /
tmpfs 886M 4.1M 882M 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 178M 4.0K 178M 1% /run/user/0
2. 检查内存与使用情况
free -h
total used free shared buff/cache available
Mem: 1.7Gi 240Mi 304Mi 6.0Mi 1.2Gi 1.3Gi
Swap: 0B 0B 0B
2.根据内存与磁盘使用情况,创建Swap文件
根据当前RAM大小和使用情况决定要创建的虚拟内存大小:
- 小内存(RAM≤2GB):建议虚拟内存大小为1~2倍RAM(如 1GB RAM → 1~2GB Swap)
- 中等内存(RAM2~8GB):建议虚拟内存大小为0.5~1倍RAM(如 4GB RAM → 2~4GB Swap)
- 大内存(RAM≥8GB):内存已足够大部分场景使用,实际依赖 Swap 的概率较低,建议只需要预留2~4GB左右Swap以应对突发情况,无需根据RAM大小按比例分配。
创建的swap文件需要时连续的存储空间,而不是带有空洞(Holes)或者碎片化的,因此通过cp、truncate等命令创建的文件将无法作为交换空间使用,最推荐的方法是使用dd命令和/dev/zero文件
3.为swap文件设置权限
swap文件用来存储内存中的某些临时内容,为防止其他用户或恶意程序窃取信息,权限限制为600,即只保留root用户的读写权限,方便root用户在不需要时删除swap文件。该权限必须严格设置为600,否则可能会在后续格式化虚拟内存文件时报错
4.格式化为swap
在创建完swap文件后,需要使用mkswap命令将其格式化。mkswap命令会在文件/分区头部写入特殊的标识符(SWAPSPACE2),以向内核标记这是一个合法的Swap空间,随后命令会写入Swap元数据,包括记录 Swap 区域的大小,设置 UUID(唯一标识符,用于/etc/fstab 挂载),建立 Swap 空间的管理结构(如页表索引)等
5.启用swap交换空间作为虚拟内存
6.永久生效
修改/etc/fstab文件,使系统启动时能自动挂载该虚拟文件:
7.调整 Swap 使用倾向(可选)
修改 swappiness(默认值通常为 60,范围 0-100)
使swap使用倾向永久生效:
8.验证swap
查看所创建的虚拟内存是否已经可用
9.删除虚拟内存
然后删除 /etc/fstab 中的对应行
mkswap设置交换文件
mkswap [选项] 设备/文件
- 命令参数可以是一个磁盘分区,也可以是一个普通文件
- -c 如果参数是一个磁盘分区(块设备),在创建交换分区之前检查是否有坏块,并输出数量
- -f 强制执行操作,即使操作看起来不安全
- -L 标签名:为交换文件指定标签,后续swapon命令和/etc/fstab文件中可以使用该标签操作
- -U uuid:手动指定交换区的UUID,不使用该选项,命令也会默认生成一个uuid,后续可以使用该UUID在/etc/fstab 中挂载设备。该uuid参数也可以是:
- clear:清除该交换文件的uuid
- random:随机生成新的uuid
- time:生成新的基于时间的uuid
- -q 静默模式,不输出信息,包括警告信息
swapon/swapoff 启用/禁用交换空间
swapon [选项] [交换分区/文件]启用交换空间
swapoff [选项] [交换分区/文件]禁用交换空间
- 命令参数可以是设备文件名/普通文件名,也可是mkswap命令-L选项指定的标签名,或者-U选项指定的uuid
- -a 启动/禁用所有交换空间,命令会读取/etc/fstab文件,查找所有带有 swap 类型的条目,并自动启用/禁用它们(带有noauto选项的除外),通常用于系统启动时自动挂载所有交换空间
- -T 路径:指定一个文件以替代/etc/fstab文件作为读取配置的文件
- -e 以静默方式跳过不存在的设备
- -d 启用交换空间的 TRIM/discard 支持(SSD 优化)
- -p 值:指定一个值(0-32767)作为使用该交换空间的优先级,值越大优先越高
- --show 格式化输出交换空间状态
- -s 显示当前交换空间状态,相当于cat /proc/swaps,该选项弃用,推荐使用--show选项
- -v 详细输出信息
- -V 查看版本号
/proc/swaps 文件
/proc/swaps 是 Linux 系统中的一个虚拟文件(存放于内存而非硬盘),用于显示当前系统中交换空间(Swap)的使用情况,当创建并启用交换空间后,该文件会动态生成关于交换空间的信息。修改交换空间需通过 swapon/swapoff 命令,直接编辑此文件无效,在一些没有交换空间的系统中,该文件可能为空
Filename Type Size Used Priority
/dev/sda2 partition 2097148 0 -1
/swapfile file 102396 0 -2
Filename为交换分区/交换文件的路径
Type为交换空间类型,partition表示使用磁盘分区作为交换空间,file表示使用普通文件作为交换文件
Size表示交换空间的总大小(以 KB 为单位)
Priority为交换空间的优先级,数值越高优先级越高
工作管理
将程序转入后台运行/暂停
在命令后添加 & ,可使该命令在后台执行,后台执行的任务如果有输出语句依旧会显示于屏幕上(STDOUT和STDERR的消息)
在命令运行时执行 Ctrl + Z 是将当前工作暂停后转入后台
jobs查看后台的工作
jobs [选项]
- -l 显示进程的PID和作业号
- -p 只显示进程PID
- -r 只显示运行中的进程
- -s 只显示停止的进程
[3]代表工作序号,“+”号代表最后一个放入后台的工作,“-”号代表倒数第二个放入后台的工作,恢复时默认使用出栈方式从最后一个放入后台的工作开始恢复
表示任务的方法jobspec
在后台任务jobs中,可以使用以下方式表示一个作业,作为fg、bg、wait、kill、disown的命令参数
- %工作序号:匹配对应的工作序号(作业编号),n为jobs命令输出信息的编号,如:%1
- %字符串:匹配命令行开头包含指定字符串的任务,如:%python
- %?字符串:匹配命令行任意位置包含指定字符串的任务,如:%?data
- %%或%+:表示当前作业,即最后一个放入后台的任务
- %-:表示上一个作业,即当前作业的前一个
fg将后台暂停的工作恢复到前台执行
fg [jobspec]
- %可省略,如果不指定参数,则默认从最后放入的工作开始恢复
bg将后台暂停的工作恢复到后台执行
bg [jobspec]
- %可省略,如果不指定参数,则默认从最后放入的工作开始恢复
disown将后台任务从终端jobs任务列表移除
默认情况下,Shell会跟踪所有后台任务,当终端关闭时,shell会向它们发送SIGHUP信号,来关闭这些任务(退出终端,shell会提示有任务正在运行)。disown会将任务从当前终端的jobs任务表中移除(此时jobs命令返回值将不再包含该任务),使之脱离终端影响,并继续在后台运行,此时,即便终端退出也不会影响任务运行。与nohup不同的是,disown是让已经在运行的后台任务脱离终端,且不会自动处理输入输出的重定向;而nohup用来启动新任务并让其脱离终端影响,且nohup会自动进行重定向。
disown [选项] [jobspec或PID]
- -a 移除所有后台任务,使它们脱离终端
- -h 保留任务在jobs列表中不移除,但使任务忽略SIGHUP信号
- -r 仅移除运行中的任务
chroot指定新根目录并运行命令
chroot命令的作用是指定一个目录将其设置为虚拟的根目录,使后续命令在该虚拟根目录下执行。该命令通常用于创建一个受限的文件系统环境,使某些进程无法访问真实的系统文件。这个“根目录变更”行为类似于为进程设置一个“虚拟根目录”,这样进程就只能看到新根目录下的文件结构,从而增强系统的隔离和安全性,该命令可用于以下场景:
- 构建隔离环境:构建受限环境 (jail),限制用户或进程只能够访问特定目录下的资源,防止其对主系统产生影响
- 测试与开发:受限环境中测试软件或脚本,而不影响真实系统
- 运行旧版或兼容软件:创建一个虚拟环境来运行旧版软件或与当前操作系统不兼容的软件
- 系统修复:当系统因配置错误或损坏而无法启动时,可以使用 chroot 命令进入系统的根文件系统并进行修复操作
chroot [选项] 新的根目录 [命令]该命令需要root权限
- 如果未指定命令,则将启动一个新的shell(具体哪一个shell取决于SHELL环境变量或/bin/sh)
- 新目录中需要有shell或所执行命令的二进制文件,否则将报错command not found
- --userspec=用户名或ID[:组名或组ID]:以指定的用户身份,用户组身份执行命令
- --groups=组名或组ID:将该组作为命令进程的附加组
env在修改后的环境中运行命令
env [选项] [环境变量=值] [命令]
- 默认输出当前用户的所有环境变量,如果指定了环境变量赋值语句和命令,则该命令会在新的环境变量中执行
- -i 清除所有继承的环境变量,在一个干净环境中执行命令
- -u 变量名:删除指定的变量,再执行命令
- -C 文件名:在指定目录下运行命令,而不改变当前的工作目录
nohub退出终端时继续执行命令
当命令或脚本正在运行时,如果此时退出了当前用户或shell终端,那么这些从该终端启动的进程也会随之退出(shell终端会向它们发送SIGHUP信号)。如果希望这些进程在退出用户或shell后仍能继续运行,则需要用一个特殊的命令nohup来阻断所有发送给该进程的SIGHUP信号,这样命令或脚本在shell退出时会继续运行,其语法为:
我们使用的脚本和命令都与调用该命令的终端会话(如pts/0)相关联(可以通过ps命令查看进程所属的终端)。当退出终端时,如果存在被停止的进程或仍在运行的后台进程,大多数终端会发出警告提示有未完成的任务。在使用nohub命令后,该命令会解除终端与进程的关联,进程将不再继承终端的标准输出(STDOUT)和标准错误(STDERR)。nohup会将stdin重定向到/dev/null,并在当前路径下创建一个名为nohup.out的文件,并将STDOUT和STDERR的消息重定向到该文件中,因此所执行命令将无法接收任何输入,且不输入任何内容到终端。如果当前路径下无法创建或写入nohup.out文件,则会尝试创建$HOME/nohup.out,如果这两个文件都无法创建,命令将不执行。也可以将其输出重定向到nohup.out以外的文件
setsid在新会话中执行命令
setsid会创建新的会话和新的进程组,并与原终端分离(没有控制终端),但stdout和stderr依旧会默认继承父进程的输出,stdin将被关闭或重定向到/dev/null(取决于具体shell实现)。
setsid [选项] 命令或脚本
- -c tty号:手动指定一个控制终端
- -w 等待命令退出
timeout限制命令执行时间
如果命令在到达指定时间后仍在运行,则将其终止,防止命令或脚本长时间挂起或无限循环的进程持续占用系统资源
timeout [选项] 时间 命令
- 时间后缀可以为s(秒)、m(分钟)、h(小时)、d(天)
- -s 信号名或信号编号:超时后发送指定的信号,默认为SIGTERM
- --preserve-status 超时后返回被终止命令的退出状态码,而不是timeout命令的退出状态码
- --foreground 让目标命令在前台运行,即使timeout在后台调用
- -k 时间time:默认情况下,timeout命令会在到达指定时间后向命令发出SIGTERM信号或-s选项指定的信号,但这些信号可能会被捕获,或者由于需要保存数据进程会保留一段时间。-k选项可以给与一个额外的时间time,如果进程在收到第一个信号后的time时间,仍然没有关闭,则timeout命令会发送SSIGKILL信号(不可捕获)来强制关闭进程,time也可以使用s、m、h、d为后缀
调整谦让度
Linux是多任务操作系统,进程在调用系统资源和占用CPU时间有不同的优先级,称之为调度优先级(scheduling priority),调度优先级由系统内核负责分配,nice命令可以通过调整niceness的值,影响调度程序计算程序的调度优先级。但注意,niceness只是给调度器的建议,调度器可以自由选择是否忽略它,即nice命令只能一定程度影响调度器的优先级计算方式,不直接作用调度优先级。
默认情况下,普通进程的niceness值为0,为正常优先级,niceness的取值范围为-20(最高优先级)到+19(最低优先级),注意!值越小优先级越高,
nice指定调度优先级
通过nice命令可以查看当前进程的优先级,如果要指定命令或脚本的调度优先级,可以使用下述语法:
nice [选项] [命令]
- 默认给与的niceness值为10
- -n 值:给与指定的值,而不是默认的10
- 只有root用户才能将进程的优先级值设置为负值,即只有root用户能提高进程的优先级,但允许所有用户降低进程的优先级
renice修改调度优先级
如果要调整已运行命令的优先级,可以使用renice命令(需要通过进程PID修改):
renice -n 值 -p 进程PID
- 只能对属于该用户的进程执行renice
- 普通用户只能通过renice降低进程的优先级
- root用户可以通过renice来任意调整进程的优先级
stdbuf调整命令的I/O缓冲
stdbuf命令用于临时更改命令的标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的缓冲模式,缓冲模式有三种:
- 行缓冲(line buffered):每一行数据写入或读取时刷新缓冲区(遇到换行符时刷新),适合用于交互式命令行工具
- 完全缓冲(fully buffered):缓冲区填满后再输出或输入,通常用于非交互式操作,提高性能
- 无缓冲(unbuffered):数据立即写入或读取,不经过缓冲
stdbuf适用于那些使用C标准库(glibc) I/O函数(如fread()和 fwrite())来处理标准输入、标准输出或标准错误的程序,如:cat、grep、sed、awk、cut、sort、head、tail、echo、printf、ls、read(作为 shell内置命令时,可能不生效,但作为外部命令时有效)、tee、tr、find、xargs、cut、wc,stdbuf无法处理那些直接使用系统调用(read()和write())作为I/O处理的函数,如:dd命令
stdbuf 选项 命令
- -i 模式:调整标准输入流的缓冲
- -o 模式:调整标准输出流的缓冲
- -e 模式:调整标准错误流的缓冲
- 模式可以取以下值:
- 0:无任何缓冲,此模式下数据会被立刻输出
- L:使用行缓冲模式,此模式下,输出数据会被合并,直到输出换行符,该选项对标准输入无效
- 值size:使用完全缓冲模式并指定缓冲区大小,size的值可以使用K、KB等单位
服务管理
服务查询
查询服务开机自启动状态
1. RPM包安装的应用服务
chkconfig --list
查询所有RPM包安装的应用服务启动状态,会标出int0-6哪个级别系统启动状态下,服务会自启动。通过管道符可以查询指定服务的启动状态,如: chkconfig | grep nginx查看nginx服务的启动状态,在Centos7以后,该命令只能查看应用服务自启动情况,不包括系统本地服务,查看本地服务可以使用systemctl list-unit-files命令,使用管道符可以只查看指定服务的启动状况。
2. 源码包安装的服务
查看安装位置下对应服务的配置文件,一般位于 /usr/local/路径下。
RPM服务管理
独立服务管理
常用文件路径
| 路径 | 说明 |
|---|---|
| /etc/init.d | 启动脚本位置 |
| /etc/xinetd.d | 基于xinetd 服务的启动脚本 |
| /etc/sysconfig | 初始化环境配置文件 |
| /etc | 配置文件位置 |
| /etc/xinetd.conf | xinetd 配置文件 |
| /var/lib | 放置服务产生的数据 |
| /var/log | 日志 |
独立服务命令
/etc/init.d/服务名 start/stop/status/restart
service/systemctl 服务名 start/stop/status/restart 红帽系列系统专属
独立服务自启动
- 将启动程序的命令写入 /etc/rc.d/rc.local文件中,系统启动后会自动执行该文件中的所有命令
- chkconfig 服务名 on/off 开启、关闭自启动,默认在2345运行级别下自启动
基于xinetd(超级守护进程)服务
xinetd负责管理系统中不频繁使用的服务,这些服务程序在有请求时才由xinetd服务负责启动运行,一旦完成服务请求服务程序结束运行,以减少对系统资源的占用。
基于 xinetd 的服务没有自己独立的启动脚本程序,需要依赖 xinetd 的启动脚本来启动。xinetd 本身是独立的服务,启动xinetd 服务的方法和启动独立服务的方法一致。
基于 xinetd 的服务只需修改 /etc/xinetd.d/服务名 文件下的 /disable为 no,然后重启xinetd 服务即可
源码包安装的服务管理
服务启动
源码包安装的服务一般通过绝对路径下的脚本启动,具体路径需查看安装说明INSTALL文件。
自启动
将启动程序的命令写入 /etc/rc.d/rc.local文件中,系统启动后会自动执行该文件中的所有命令
查看开机时服务启动顺序
Linux开机或关机时的服务启动/关闭顺序写于文件 /etc/rc.d/路径下的对应文件中, rc0-rc6 文件中分别书写有系统不同启动级别下服务启动顺序。如 rc3 中,S85nginx表示系统启动时,nginx将是第85个启动的服务,K15nginx表示系统关机时,nginx将是第15个关闭的服务。
alternatives工具
alternatives简介
alternatives工具常用于指定默认软件、默认配置,或者某一软件的默认版本。
如:在Linux中,yum等工具一般使用python2作为命令解释器,而一些较新的软件依赖较新版的python3。因此有时我们不得不同时安装python2和python3。如果使用 python3 作为默认的python版本,使用yum会抛出错误,这是因为使用了python3解析yum中python2的语法,同理,一些较新的软件也无法使用python2解析。此时,我们就需要使用alternatives来控制软件的默认版本。
alternatives的使用方法是:给定两个软件或多个软件的路径,然后将它们注册为一个组,为这个组建立一个软链接,之后调用软件将直接从这一软链接调用
alternatives命令
注册组
alternatives --install <link> <name> <path> <priority>
- --install 注册(新增)需要管理的命令/软件
- link:注册路径,会在该路径下生成一个软链,此后由该软链启动命令
- name:组名
- path:软件/命令的路径,将该路径下的命令加入alternatives管理组
- priority:权值,在自动模式下,权值越高,软件优先级越高
其他命令
- alternatives --config <name> 修改默认配置(将进入交互模式,并切换为手动模式)
- alternatives --set <name> <path> 修改默认配置(将切换为手动模式)
- alternatives --auto <name> 切换为自动模式
- alternatives --display <name> 显示对应组的配置信息(包括自动/手动模式,路径,权值)
- alternatives --remove <name> <path> 删除组中对应路径的软件
- alternatives --list 列出所有组的信息(组名、自动/手动模式、当前默认软件路径)
示例
1. 注册组
在/usr/bin目录下有python2.7与python3.7的启动命令,我们可以新建python组,将python2和python3的启动路径加入到该组中,并指定python3为默认版本,此后直接执行python命令将唤醒python3,而不用再指定明确的版本号,且将默认唤醒python3,该默认值是可以随时更改的
# alternatives --install /usr/bin/python python /usr/bin/python2.7 10
# alternatives --install /usr/bin/python python /usr/bin/python3.6 20
上述命令
- 将在 /usr/bin 目录下新建名为 python 的软链接,该软链接指向/etc/alternatives/python,该链接又指向/usr/bin/python3.6
- 修改默认值,修改的是/etc/alternatives/python的指向,即默认值为python2.7时,/etc/alternatives/python链接指向将修改为/usr/bin/python2.7
- python3.6的权值为20,python2.7的权值为10,自动模式下,alternatives将优先调用python3.6
- 生成链接名可以任意自定义,并且调用命令也将相应修改,如:调用命令将变为py:
alternatives --install /usr/bin/py ppyy /usr/bin/python3 10py --version #同python3 --version命令
2. 修改默认值
alternatives --config pythonEnter to keep the current selection[+], or type selection number:
+号为当前生效的版本,*为新增版本
3. 查看python组信息
alternatives --display python4. 从组中删除python3.6版本
alternatives --remove python /usr/bin/python3.6定时任务
at命令
at命令用于预设脚本或命令的运行时间,at命令的守护进程atd会以后台模式运行,检查作业队列来运行作业。大多数Linux发行版会在启动时运行此守护进程,atd守护进程会检查系统上的一个特殊目录(通常位于/var/spool/at)来获取用at命令提交的作业。默认情况下,atd守护进程会每60秒检查一下这个目录,并获取作业预定的运行时间。at命令的语法为:
at [选项] 时间
- 默认情况下,输入at+时间后,at命令会进入交互模式开始接收需要执行的命令,输入完毕后通过Ctrl+D完成输入
- 如果已经错过指定时间,则命令会在第二天的同一时间再执行
- -f 文件名:到指定时间执行该脚本
- -q 字母:指定队列字母
- -M 屏蔽脚本或命令的输出信息
at命令支持的时间格式很多,包括:
- 具体的精确时间,如:at 10:30、at 2pm、at 2024-06-21 15:00
- 相对时间,如:at now + 1 hour、at now + 2 days、at 3pm tomorrow、at 10:30am + 1 week
- 特定命名时间,如:at now(立即执行)、at noon(中午12:00)、at midnight(午夜12:00)、at teatime(下午茶时间4:00)、
- AM/PM指示符,如:at 10:15PM
- 标准日期格式(MMDDYY、MM/DD/YY或DD.MM.YY)
- 文本日期,比如Jul 4或Dec 25,加不加年份均可
在使用at命令时,该作业会被提交到作业队列(job queue)。作业队列会保存通过at命令提交的待处理的作业。针对不同优先级,存在26种不同的作业队列。作业队列通常用小写字母a-z和大写字母A-Z来指代,作业队列的字母排序越高,作业运行的优先级就越低(更高的nice值)。默认情况下,at的作业会被提交到a作业队列。如果想以更高优先级运行作业,可以用-q参数指定不同的队列字母。
当作业在Linux系统上运行时,作业中的输出将不显示到屏幕上。取而代之的是,Linux系统会将提交该作业的用户的电子邮件地址作为STDOUT和STDERR。任何发到STDOUT或STDERR的输出都会通过邮件系统发送给该用户,这需要Linux安装了sendmail应用程序。如果未安装该程序,或者不需要脚本输出信息,应当做好重定向工作,或使用-M选项屏蔽作业产生的输出信息。
查询at定时任务
atq 查询at命令设置的作业
该命令会返回了作业号、系统运行该作业的日期和时间及其所在的作业队列(字母)
删除at定时任务
atrm 作业号 删除指定的作业
普通用户只能删除自己提交的作业,无法删除其他用户的作业
crond服务
cron即计划任务,而crond则是一个常驻服务,在Linux中用于周期性执行某个任务,该服务的配置文件位于/etc/crontab
查看crond服务运行情况
ps aux | grep crond查看crond进程是否在运行,红帽系列的操作系统可使用service status crond或systemctl status crond(centos7+)
查看crond服务是否开机自启动
chkconfig --list | grep crond或systemctl list-unit-files | grep crond(centos7+)
设置crond定时任务
可通过修改/etc/crontab文件来设置定时任务,同路径下还有 cron.daily,cron.weekly等对应时间记录crond任务的文件。也可以通过命令来修改crontab文件,语法为:
crontab [参数]
- -e 编辑crontab定时任务
- -l 查询crontab定时任务
- -r 删除当前用户所有crontab任务
cron语法
编辑定时任务时会打开vi编辑器,编辑语法格式需遵循cron语法,基本格式为:***** 命令
- 第一个*表示一小时当中的第几分钟,范围为0-59
- 第二个*表示一天当中的第几个小时,范围为0-23
- 第三个*表示一个月当中的第几天,范围为1-31
- 第四个*表示一年当中的第几个月,范围为1-12
- 第五个*表示一周当中的星期几,范围为0-7(0和7都代表星期日)
| 特殊符号 | 含义 |
|---|---|
| * | 代表任何时间 |
| , | 代表不连续的时间 |
| - | 代表连续的时间范围 |
| */n | 代表隔多久执行一次 |
日志服务
rsyslog服务
Syslog(系统日志协议)是在一个IP网络中转发系统日志信息的标准,syslogd服务被广泛用于老版Unix/Linux系统中负责记录系统日志,RSyslog是syslog的多线程增强版,CentOS6以后系统默认使用Rsyslogd服务记录系统日志。
查询rsyslog服务是否在运行
可使用命令ps aux | grep rsyslogd查看rsyslog进程是否在运行,红帽系列可使用命令systemctl status rsyslog查看
查看rsyslog服务是否开机自启动
- chkconfig –list |grep rsyslog
- systemctl list-unit-files | grep rsyslog(centos7)
日志文件
系统日志默认保存在 /var/log 路径下,对应文件的作用:
| 文件 | 说明 |
|---|---|
| /var/log/cron | 定时任务相关日志 |
| /var/log/cups | 打印系统的日志 |
| /var/log/dmesg | 开机内核自检的信息,使用dmesg命令就是读取了该文件 |
| /var/log/btmp | 错误登录日志,二进制文件,需通过lastb命令查看 |
| /var/log/lastlog | 记录所有用户最后一次登录系统的日志,二进制文件,需通过lastlog命令查看 |
| /var/log/mailog | 邮件日志 |
| /var/log/message | 记录系统所有重要事件信息 |
| /var/log/secure | 记录所有涉及用户账户和密码的信息,如:用户登录,添加用户,切换用户,sudo授权,修改密码等 |
| /var/log/wtmp | 永久记录所有用户的登录、注销、系统启动、重启等信息,二进制文件,需使用last命令查看 |
| /var/log/utmp | 记录当前登录的用户信息,并且随着用户注销、切换不断变化,使用w,who,users等命令查看 |
使用RPM包安装的服务也会默认把日志文件放在/vat/log/服务名 路径下,但其日志由自身服务管理,而不归rsyslogd服务管理
使用源码包安装服务的日志文件位于用户指定的安装路径下,一般位于 /usr/local路径下
rsyslog日志格式
日志文件通常由以下内容按顺序书写:
- 事件产生时间
- 服务器主机名
- 产生事件的服务名
- 事件的具体信息
rsyslog日志配置文件
该配置文件位于/etc/rsyslog.conf,配置文件决定了日志系统记录哪些级别的日志信息,文件的格式为 服务名[连接符]日志等级 日志记录位置
服务名
| 服务名称 | 说明 |
|---|---|
| auth | 安全和认证相关信息 |
| authpriv | 安全和认证相关信息(私有信息) |
| cron | 系统定时任务cront和At产生的日志 |
| daemon | 守护进程相关的日志 |
| ftp | ftp守护进程相关日志 |
| kern | 内核产生的日志 |
| local0-local7 | 为本地预留的服务项 |
| lpr | 打印系统产生的日志 |
| 邮件日志 | |
| news | 新闻服务器相关日志 |
| syslog | rsyslog服务产生的日志 |
| user | 用户等级类别产生的日志 |
| uucp | uucp(数据传输协议)子系统的日志 |
连接符
| 连接符 | 说明 |
|---|---|
| . | 表示比后面所写等级高(包含该等级)的日志都记录下来 |
| .= | 只记录指定等级的日志 |
| .! | 除了该等级,其余等级都记录 |
日志等级
| 等级 | 说明 |
|---|---|
| * | 所有等级 |
| none | 与*相反,不记录任何日志 |
| debug | 调试信息 |
| info | 通知信息,反馈系统状态 |
| notice | 提醒信息,程序可能存在潜在错误,但不影响运行 |
| warning | 警告信息,程序发现错误,暂且不影响运行 |
| err | 错误信息,服务出错停止运行,需要修复 |
| crit | 临界状态信息,服务宕机,且可能无法修复 |
| alert | 警报信息,服务宕机,影响系统运行 |
| emerg | 紧急信息,系统疼痛等级,系统濒临崩溃甚至已经崩溃 |
日志记录位置
日志记录位置可以是以下值:
- 路径,写于本机指定位置,如:/var/log/lastlog
- 系统设备,写于U盘或者通过打印机打印日志,如:/dev/lp0
- 转发到远程主机或日志服务器,如:@192.168.0.100:514
- 用户名,发送给指定用户,如:root
- 忽略或丢弃日志,如:~ ,直接丢弃
示例
以下示例来源于centos7系统默认配置
日志轮替
日志轮替用于用新日志覆盖旧日志,其配置文件位于/etc/logrotate.conf,需要相关功能只需在配置文件中添加对应参数就即可。
| 参数 | 说明 |
|---|---|
| daily/weekly/monthly | 日志轮替周期 |
| rotate 数字 | 保留日志文件的个数,0为不备份 |
| compress | 日志轮替时,对旧日志进行压缩 |
| create 权限值 所有者 所属组 | 建立新日志,并指定日志文件的权限、所有者、所属组 |
| mail address | 日志轮替时,日志内容发送到指定邮箱,如:mail 11@gmail.com |
| missingok | 日志不存在时,忽略该日志的警告信息 |
| notifempty | 如果日志文件为空,则不进行轮替 |
| maxsize 大小 | 当日志文件到达指定大小,无论是否到轮替时间,都进行一次轮替,未到达指定大小但到达轮替周期,也进行轮替 |
| minsize 大小 | 到达轮替时间时,如果日志文件达到该最小值时就进行轮替,否则不进行轮替 |
| size 大小 | 时间周期设置无效,只有当日志文件大于指定大小才进行轮替 |
| dateext | 使用日期作为日志轮替文件名 |
配置文件内容
通过RPM包安装的服务其日志会被自动识别配置轮替,通过源码包安装的服务需要自行添加配置,配置格式同本地配置的基本格式。
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp – we’ll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
本地配置格式(若某参数同时设置了本地配置和全局配置,则本地配置生效)
日志路径 {
配置参数
}
如:
/usr/local/apache/logs/access_log {
daily //每天进行日志轮替
create //日志轮替时新建日志,文件权限、所有者等信息默认
rotate 30 //保留30份日志文件(即保留30天)
}
手动进行日志轮替
logrotate [参数] 配置文件名
不添加任何参数时,将按配置文件进行轮替
- -v 显示日志轮替的过程
- -f 无论是否达到轮替配置要求,强制进行日志轮替
备份与恢复
备份
完全备份:即把所有需要备份的数据全部备份, 在Linux 中,完全备份指将根目录下的所有文件进行备份。
增量备份:指第一次进行完全备份,服务器运行一段时间后,比较当前数据和第一次备份数据之间的差异,只备份有差异的数据,之后的每次备份都只备份与上一次备份有差异的数据。
一般需备份的数据
- /root/ 管理员账户根目录
- /home/ 普通用户家目录
- /var/spool/mail 邮件
- /etc/ 重要服务的配置文件
- /var/log 常用服务的日志
- 数据库数据、账户资料….
dump文件备份系统
1. 安装dump
- yum -y install dump (redhalt系列)
- apt-get install dump (debian系列)
2. dump命令
dump [参数] 备份后文件名 原文件或目录
- -[0-9级别] 可选0-9备份级别
- -f 文件名 指定备份后的文件名
- -u 备份成功后,把备份时间、备份级别等信息记录在 /etc/dumpdates 文件中
- -v 显示备份过程中更多的输出信息
- -j 调用 bzlib 库压缩备份文件,其实就是把备份文件压缩为 .bz2 格式,默认压缩等级为2
- -W 显示允许被 dump 的分区的备份等级及备份时间
3.备份操作
对于某个文件或不是分区的目录,dump只能使用 0 级别进行完全备份。而备份分区或整块硬盘时,dump 通过“备份级别”实现增量备份,其中,0 级别是完全备份,1-9为增量备份。
当我们备份数据时,第一次备份应该使用 0 级别,dump会把所有数据完全备份一次;第二次备份就可以使用 1 级别了,它会和 0 级别进行比较,把 0 级别备份之后变化的数据进行备份;第三次备份使用 2 级别,2 级别会和 1 级别进行比较,把 1 级别备份之后变化的数据进行备份,以此类推。
备份目录
备份分区
restore还原dump备份的文件
restore [模式选项] [-f 文件名]
-f用于指定备份文件文件名,模式选项有四个,只能选一个模式
- -C 比较模式,比较备份数据和现有数据的不同并返回(只能检测出数据修改或减少的部分,如果新增了数据不会被检测到)
- -i 交互模式,手动选择需要恢复的文件
- -t 查看模式,用于查看备份文件中拥有哪些文件和目录
- -r 还原模式,用于数据还原(如果是增量备份,则需先还原首次完全备份的数据)