跳转到内容

Linux常用命令

linux默认shell

在大多数 Linux 系统中,/etc/shells 文件中列出了各种已安装的 shell。

查看默认的shell:

cat /etc/passwd

也可以使用neofetch查看。

也可以echo $0查看当前shell。

在现代 Linux 系统中, /bin 目录通常是/usr/bin/目录的符号链接, 这就是为什么用户 christine 的默认 shell 程序是/bin/bash,但 bash shell 程序实际位于/usr/bin/目录。

对 bash shell 脚本来说,这两种 shell(默认的交互 shell 和默认的系统 shell)可能会导致问题。熟悉有关 bash shell 脚本首行的语法要求,以避免这些麻烦。

并不是非得使用默认的交互式 shell。可以启动任意一种已安装的 shell,只需输入其名称即可。但屏幕上不会有任何提示或消息表明你当前使用的是哪种 shell。

$0 变量可以助你一臂之力。 命令 echo $0 会显示当前 shell 的名称,提供必要的参考。

使用 echo $0 显示当前所用 shell 的做法仅限在 shell 命令行中使用。如果在 shell 脚本中使用,则显示的是该脚本的名称。

shell变量与export

全局变量

全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的。

局部环境变量则只对创建它 的 shell 可见,子shell无法继承。

如果程序创建的子 shell 需要获取父 shell 信息,那么全局环境变量就能派上用场了。

查看全局变量:

bash
printenv

或者:

bash
env

要显示个别环境变量的值,可以使用 printenv 命令(不能使用 env 命令);也可以echo $var

局部变量

局部变量没有专门的命令,set命令可以查看全局+局部。

set 命令可以显示特定进程的所有环境变量,既包括局部变量、全局变量,也包括用户自定义变量。所有通过 env 命令或 printenv 命令能看到的全局环境变量都出现在了 set 命令的输出中。除此之外,还包括局部环境变量、用户自定义变量以及局部 shell 函数。

bash shell 的惯例是所有的环境变量均使用大写字母命名。如果是你自己创建或在 shell 脚 本中使用的局部变量,则使用小写字母命名。变量名区分大小写。坚持使用小写字母命 名用户自定义的局部变量,能够让你避免不小心与系统环境变量同名可能带来的灾难。

export

export 命令的功能是将变量提升成环境变量,亦可将 shell 函数输出为环境变量。通常个人创建出的变量仅能在自己账户下使用,其他人是无法看到的。

可以直接简化成:export my_var="I am out"

在定义并导出变量 my_variable 后,bash 命令生成了一个子 shell。在该子 shell 中可以正 确显示出全局环境变量 my_variable 的值。子 shell 随后改变了这个变量的值。但是,这种改变仅在子 shell 中有效,并不会反映到父 shell 环境中。

unset

删除环境变量:unset 变量名

在涉及环境变量名时,什么时候该使用 $ ,什么时候不该使用 $ ,实在让人摸不着头脑。 只需记住一点:如果要用到(doing anything with)变量, 就使用 $ ;如果要操作(doing anything to) 变量,则不使用 $ 。这条规则的一个例外是使用 printenv 显示某个变量的值。

和修改变量一样,在子 shell 中删除全局变量后,无法将效果反映到父 shell 中。

$PATH

PATH 环境变量定义了用于查找命令和程序的目录

如果命令或者程序所在的位置没有包括在 PATH 变量中,那么在不使用绝对路径的情况下, shell 是无法找到的。

修改PATH:

yaml
PATH=$PATH:/home/christine/Scripts

对于 PATH 变量的修改重启系统失效。

数组变量

有时候,数组变量只会把事情搞得更复杂,所以在 shell 脚本编程时并不常用。数组并不太方便移植到其他 shell 环境。

数组在shell中不常见。

linux-command

命令大全开源项目:https://github.com/jaywcjlove/linux-command

主页中还有一些Linux学习资源整理。

应该是最好的Linux命令搜索和学习网站了。

在线搜索命令:https://wangchujiang.com/linux-command/

命令行的艺术

开源项目主页:https://github.com/jlevy/the-art-of-command-line

中文翻译:https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md

快乐的Linux命令行

英文版本:https://linuxcommand.org/

中文版本:https://billie66.github.io/TLCL/

可在线阅读,也有pdf提供,很好的在线书籍。

Linux常用命令手册

常用命令入门小手册。

命令介绍,参数列举,参考示例。

所有命令都在官网上有,可以搜藏网址,当做在线搜索命令或者复习用。

https://www.linuxcool.com/

查看命令工具tldr

项目主页与安装

开源主页:https://github.com/tldr-pages/tldr

安装方式:

bash
pip3 install tldr
source .profile
tldr -u

使用:

bash
tldr + 命令

使用注意

提示ssl错误

bash
git config --global http.sslverify false
git config --global https.sslverify false

并确保网络是通畅的。

本地缓存设置

官方文档:

You can configure the behavior and output of the tldr client by setting environment variables. For example, in the .bashrc file:

bash
export TLDR_COLOR_NAME="cyan"
export TLDR_COLOR_DESCRIPTION="white"
export TLDR_COLOR_EXAMPLE="green"
export TLDR_COLOR_COMMAND="red"
export TLDR_COLOR_PARAMETER="white"
export TLDR_LANGUAGE="es"
export TLDR_CACHE_ENABLED=1
export TLDR_CACHE_MAX_AGE=720
export TLDR_PAGES_SOURCE_LOCATION="https://raw.githubusercontent.com/tldr-pages/tldr/main/pages"
export TLDR_DOWNLOAD_CACHE_LOCATION="https://tldr-pages.github.io/assets/tldr.zip"

TLDR_CACHE_ENABLED (default is 1):

  • If set to 1, the client will first try to load from cache, and fall back to fetching from the internet if the cache doesn't exist or is too old.
  • If set to 0, the client will fetch from the internet, and fall back to the cache if the page cannot be fetched from the internet.

TLDR_CACHE_MAX_AGE (default is 168 hours, which is equivalent to a week): maximum age of the cache in hours to be considered as valid when TLDR_CACHE_ENABLED is set to 1.

Cache location

  • In order of precedence:
  • $XDG_CACHE_HOME/tldr
  • $HOME/.cache/tldr
  • ~/.cache/tldr

If you are experiencing issues with tldr, consider deleting the cache files before trying other measures.

改成自己的,比如:

bash
export TLDR_CACHE_ENABLED=1
export TLDR_CACHE_MAX_AGE=7200

启用cache:

bash
git clone https://gitcode.com/tldr-pages/tldr.git  ~/.cache/tldr

源码路径配置完事就能用了。

各种xxxstat命令

dstat

dstat是一个新的性能工具,它吸收了 vmstat、iostat、ifstat 等几种工具的优点,可以同时观察系统的 CPU、磁盘 I/O、网络以及内存使用情况。

安装:

bash
sudo apt/yum install dstat

vmstat

vmstat 命令来自英文词组 virtual memory statistics 的缩写,其功能是监视系统资源状态。 可以使用 vmstat 查看系统中关于进程、内存、硬盘等资源的运行状态,但无法深入分析。vmstat 命令是一款轻量级的性能查看工具,不会给系统带来什么负担。

iostat

监视IO设备使用情况:

综合对比

内容参考了kimi:

mpstat、pidstat、vmstat 和 iostat 都是 Linux 系统中用于监控性能的工具,它们各自关注不同的系统资源和性能指标。

  • mpstat 用于监控多核 CPU 系统中各个 CPU 核心的性能。
  • pidstat 用于监控进程级别的 CPU、内存、IO 和上下文切换等性能指标。
  • vmstat 提供了系统级别的虚拟内存、进程、内存、IO 和 CPU 的综合统计信息。
  • iostat 用于监控系统 IO 设备的性能,包括磁盘 IO 的统计数据。

这些工具可以单独使用,也可以组合使用,以获得更全面的系统性能视图。

mpstat 与 vmstat

关联:

mpstat 是 sysstat 包中的一个工具,而 vmstat是一个系统监控工具,它们都可以提供 CPU 使用率的信息。

区别:

mpstat专注于 CPU,特别是多处理器系统中各个 CPU 核心的使用情况。它可以报告单个 CPU 核心的统计数据,也可以报告所有 CPU 核心的平均数据。

vmstat提供了关于系统虚拟内存、进程、内存、IO 和 CPU 的统计信息。它更多地关注整体系统性能,而不是单个 CPU 核心。

pidstat 与 vmstat

关联:

pidstat 也是 sysstat 包中的一个工具,它可以提供进程级别的 CPU 和内存使用情况,而 vmstat 可以提供系统级别的内存使用情况。

区别:

pidstat 专注于进程,它可以显示特定进程或所有进程的 CPU、内存、IO 和上下文切换等详细统计信息。

vmstat 提供的是系统级别的统计信息,包括内存使用情况(如空闲、缓冲区、缓存等)、进程创建和退出、IO 统计等。

iostat 与 vmstat

关联:

iostat 和 vmstat 都可以提供 IO 相关的统计信息。

区别:

iostat 专注于输入/输出设备负载、设备利用率和系统 IO 的统计信息。它可以报告物理和逻辑设备层面的 IO 性能数据。

vmstat 提供的是系统级别的 IO 统计信息,但它更侧重于整体的系统性能,包括内存、CPU 和 IO 的综合使用情况。

systemctl

systemctl是很常用的命令,以sshd服务进程为例记录

查看ssh是否安装

查看ssh是否安装:

bash
rpm -qa | grep ssh

如有显示类似下面这些就说明安装了

text
libssh2-1.4.3-10.el7.x86_64
openssh-server-6.6.1p1-22.el7.x86_64
openssh-clients-6.6.1p1-22.el7.x86_64
openssh-6.6.1p1-22.el7.x86_64

安装命令:

bash
sudo yum install openssh-server

查看ssh服务状态

方法一:

bash
/etc/init.d/sshd status

方法二:

bash
systemctl status sshd.service

启停命令

1、开启SSH服务

bash
service sshd start

2、停止SSH服务

bash
service sshd stop

3、重启SSH服务

bash
service sshd restart

4、验证服务是否启动成功

bash
netstat -antp | grep sshd

开机自启配置

1、检查SSH是否在本运行级别下设置为开机启动

bash
chkconfig --list sshd

执行结果 sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

2、如果没有设置可通过下面命令设置运行级别

bash
chkconfig --level 2345 sshd on

指定运行级别为2,3,4,5 等级0表示:表示关机 等级1表示:单用户模式 等级2表示:无网络连接的多用户命令行模式 等级3表示:有网络连接的多用户命令行模式 等级4表示:不可用 等级5表示:带图形界面的多用户模式 等级6表示:重新启动

3、设置开机启动信息

bash
chkconfig sshd on

也可以通过以下命令设置

bash
systemctl enable sshd

查看所有开机启动的服务

bash
systemctl list-unit-files --state=enabled

service --status-all

查看所有服务的运行状态信息:

bash
service --status-all

[+] 代表服务是在运行的状态 [-] 代表服务是在关闭的状态

其他常用:

journalctl dmesg strace

linux下常用的日志排查与进程追踪命令有journalctl dmesg strace等

journalctl

journalctl 命令来自英文词组 journal control 的缩写,其功能是查看指定的日志信息。

在 RHEL 7/CentOS 7 及以后版本的 Linux 系统中,systemd 服务统一管理了所有服务的启动日志, 带来的好处就是可以只用 journalctl 一个命令来查看全部的日志信息了。

查看默认的系统日志:

bash
sudo journalctl

显示带有额外信息的最新日志:

bash
sudo journalctl -xe

查看特定service日志:

bash
sudo journalctl -u sshd

实时刷新最新产生的日志:

bash
sudo journalctl -f

dmesg

用于显示或控制内核环缓冲区。内核环缓冲区是操作系统内核用来记录系统启动过程中的消息和系统运行时的日志信息的地方。

基本用法

查看日志: 执行 dmesg 命令可以查看系统启动时的日志信息。

实时更新: 使用 dmesg -w 可以实时查看内核消息,这在调试硬件问题时非常有用。

常用选项:

  • -h 或 --human-readable:以更易读的格式显示日志。
  • -c:清除当前的内核消息缓冲区。
  • -s SIZE:显示从缓冲区开始的指定数量的日志条目。
  • -t:显示时间戳。
  • -r 或 --raw:以原始格式显示日志。
  • -w:等待并显示新的日志消息。

dmesg 是系统管理员和开发者常用的工具,用于诊断系统问题和监控系统状态。

strace

strace 命令跟踪系统调用和信号。它提供了流程正在执行的操作的详细信息。

strace 的一个简单用途是使用 PID 来跟踪正在运行的进程。

bash
strace -p PID
strace -p PID -e system_call,system_call2
strace -o output.txt command_name

如果某个程序恰好挂起而找不到原因,则可以跟踪该程序正在进行的系统调用并揭示其卡住的原因。

ln软链接与硬链接

kill -USR1 命令

kill -USR1 是一个在Unix和类Unix操作系统中使用的命令,它用于向一个进程发送SIGUSR1信号。SIGUSR1是一个用户自定义信号,通常用于通知进程发生了某个特定的事件,而具体的处理方式由程序开发者定义。

例如,开发者可以在程序中捕获SIGUSR1信号,并在信号处理函数中执行特定的代码,比如重启服务、重新加载配置文件、进行日志记录等。

这个命令通常不会直接导致进程被终止,而是触发了程序内部的某些逻辑。如果你在命令行中使用kill -USR1命令,你需要指定进程的PID(进程ID)作为参数,例如:

bash
kill -USR1 <PID>

只有当你有权限向该进程发送信号时,这个命令才会有效,否则你可能需要使用sudo来获取必要的权限。同时,使用信号时要谨慎,因为它们可以影响程序的正常运行。

mongodb的SIGUSR1信号

MongoDB 对 SIGUSR1 信号的默认处理行为是触发日志文件的轮换。当 MongoDB 进程接收到 SIGUSR1 信号时,它会将当前的日志文件重命名,通常在文件名后附加一个 UTC 时间戳,然后开启一个新的日志文件继续记录操作。这个行为与执行 MongoDB 的 logRotate 命令效果相同,可以用于手动触发日志文件的轮换。

解决mongo日志太大的问题

重新生成mongodb日志,并搬走日志步骤:

  • ps -ef | grep mongod
  • 执行kill -USR1 进程号,kill -USR1 + mongo进程id,重新生成一个日志文件,一般对服务无影响(但是要确认,不可想当然)
  • 搬走日志文件

命令增强工具 x-cmd

x-cmd官网:https://cn.x-cmd.com/

github主页:https://github.com/x-cmd/x-cmd

安装:

bash
eval "$(curl https://get.x-cmd.com)"

直接官网主页有教程。

dd命令创建空洞文件

利用dd命令创建文件,以及ls和du查看文件大小的区别。

bash
dd if=/dev/zero bs=4M count=10 seek=20 of=testfile

一块4M

count 10块

seek 跳过20块 80M是空洞大小

ls -lh 显示文件长度,包含空洞

du -h 显示实际占用大小,跳过空洞

dd 这种类比虚拟机磁盘占用,动态扩容。

压缩与归档gzip tar tgz

最常用tar解压命令

bash
tar -xvf filename.tar
tar -zxvf filename.tgz

注意后缀。带g则是gzip 解压的时候加z参数,普通的tar解压就是-xvf参数。

gzip + 目录/文件

tar命令详解

挂载mount umount

mount

umount

移除可移动设备时,不能直接将设备拔下,应该先卸载。

如果在卸载设备时,系统提示设备繁忙,无法卸载,那么通常是有进程还在访问该设备或使用该设备上的文件。这时可用 lsof 命令获得相关进程的信息,然后将进程终止。

lsof 命令的用法很简单:

bash
lsof /path/to/device/node

或者:

bash
lsof /path/to/mount/point

blkid挂载光驱cdrom

bash
sudo mkdir /mnt/cdrom
sudo mount /dev/sr0 /mnt/cdrom

其他操作参考:

cat命令清空文件

big_filename是大文件:

bash
cat /dev/null > /xxx/big_filename

shell内建命令与外部命令

route -n ip route

查看路由表、网关

bash
netstat -r
route -n
ip route

netstat被ip和ss取代,尽量使用新的命令。

windows下查看:

bash
route print

可以同时打印出IPV4、IPV6的路由的链路列表的信息。

net-tools与iproute2

阐述ifconfig 和 ip的区别,进而说明net-tools与iproute2的联系和区别。

net-tools与iproute2安装:

centos 7 和以前版本使用 net-tools,包括:

bash
ifconfig
route
netstat

centos 8 和以上版本使用 iproute2,包括:

bash
ip
ss

怎么快速记住:新的都是两个字母,更加简洁

ifconfig与ip

ifconfig 和 ip 分别属于软件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代

通常情况下它们会在发行版中默认安装。但如果你找不到 ifconfig 或者 ip 命令,可以安装这两个软件包。

ifconfig 和 ip 命令输出的指标基本相同,只是显示格式略微不同。比如,它们都包括了网络接口的状态标志、MTU 大小、IP、子网、MAC 地址以及网络包收发的统计信息。

这些具体指标的含义,在文档中都有详细的说明,不过,这里有几个跟网络性能密切相关的指标,需要你特别关注一下。

第一,网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。

第二,MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。

第三,网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。

第四,网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:

  • errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
  • dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
  • overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
  • carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
  • collisions 表示碰撞数据包数。

常用命令之nohup

后台运行命令,以及恢复命令的前台执行

*nix系统下有很多关于后台、挂起、前台恢复的命令;在此列举一些常用的,尤其是最强大的nohup。

&

在命令后面加&,表示后台运行。

Ctrl + z

表示将当前命令挂起到后台,隐藏到后台,并且暂停运行。

jobs

查看当前有多少在后台运行的命令

bg

将挂起的进程恢复在后台运行; Ctrl+z以后,进程在后台是暂停状态,bg可以使其恢复执行,但还是在后台执行。

fg

将后台运行的进程恢复到前台运行。

nohup

该命令可以在退出帐户或关闭终端之后继续运行相应的进程,使用场景有:

  • 运行一个进程,而且你觉得在退出帐户时该进程或关闭终端时还不会结束。
  • crontab定时任务或脚本进程里面执行命令。

使用示例,nohup命令的一般使用形式为:

bash
nohup command >out.file 2>&1 &

参数解释:

  • “1”表示文件描述符 1,表示标准输出,
  • “2”表示文件描述符 2,意思是标准错误输出,
  • “2>&1”表示标准输出和错误输出合并了。合并到哪里去呢?到 out.file 里。
  • 最后的“&”表示后台运行。

不想保存日志可以重定向到/dev/null:

bash
nohup command  > /dev/null  2>&1 &

常用命令之less

lesss is more than more

less命令

less是more命令的升级版本;文本文件的读取一般使用less,尤其较大文件。

  • less 命令可以在完成整个文件的读取之前显示文件的内容,一次显示一屏的文件文本,高效利用内存,不用把文件全部加载到内存再显示,比如cat命令就不能处理大文件。
  • less 命令提供了多个非常实用的特性,能够实现在文本文件中前后翻动,还有一些高级搜索功能,快捷键跟vim有很多重叠之处。
  • less 通常为手册页提供分页服务。你对 less 了解得越多,阅读各种命令手册页的时候就越得心应手。

head和tail命令

如果要查看的数据位于文本文件的开头或末尾。可以使用head和tail命令,tail与head也不用等读取完再显示。 tail 命令会显示文件最后几行的内容(文件的“尾部”)。在默认情况下,它会显示文件的末尾 10 行。 可以向 tail 命令中加入-n 选项来修改所显示的行数。 只显示文件的最后两行:

bash
tail -n 2 log_file

tail 命令有一个非常酷的特性:-f 选项,该选项允许你在其他进程使用此文件时查看文件的内容。 tail 命令会保持活动状态并持续地显示添加到文件中的内容。这是实时监测系统日志的绝佳方式。

head命令与tail相反,读取文件头部,-n也是默认10。但没有-f选项。

常用命令之ps

ps命令与netstat类似,参数比较多,需要记住一些重要的,常用的

ps实践最常用法

查看所有进程

ps -ef 和 ps -efl(小写的l)

查看所有进程及其线程

ps -efL (大写的L)

查看某用户下的进程及其线程

ps -u username -Lf

查看特定进程的线程,结果包含进程本身

假设进程ID为1234: ps -mp 1234 -Lf

查看特定进程的线程,结果不包含进程本身

假设进程ID为1234: ps -p 1234 -Lf

部分参数与输出结果解释

ps 命令堪比工具中的瑞士军刀,能够输出系统中运行的所有程序(进程)的大量信息。 遗憾的是,ps有很高的复杂性:数不清的选项或许让 ps 命令成了最难掌握的命令。

Note: -l参数是长格式的输出,实际使用中,加不加-l,输出结果的数量也可能有略微不同。 -L则是显示进程里面的线程。

常用命令之tee

tee命令:读取标准输入内容(包括缓冲区比如vim编辑刷新内容),将读取到的数据写到标准输出和文件。

bash
echo "Hello, Linux!" | tee output.txt

没有-a参数,表示直接覆盖output.txt里面的内容。

bash
echo "Appended Text" | tee -a output.txt

-a:追加到文件而不是覆盖。使用该选项,可以将输出内容追加到指定文件的末尾。

适合用来添加内容到文件,比如日志等:

bash
some_command | tee -a operation.log
command_with_error 2>&1 | tee output.txt
echo "Data" | sudo tee file.txt > /dev/null

同时写入多个文件:

bash
echo "Data" | tee file1.txt file2.txt file3.txt

同时查看日志文件的变化并保存到文件:

bash
tail -f /var/log/syslog | tee syslog_monitor.log

这个例子中,tail -f用于实时跟踪日志文件的变化,而tee则将输出同时显示在终端并保存到syslog_monitor.log文件中。

常用命令之rm

删除命令相关,rm权力太大,要限制,尤其是root和sudo执行rm。

配置里直接echo来禁用

bash
alias rm='echo " rm command is disabled."'

这种方式不好,就像是直接弹窗说,别用rm命令。

配置alias,引导到trash-cli

bash
sudo apt install trash-cli
cd
vim .bashrc
alias rm='trash-put'
source .bashrc

trash-cli常用命令:

  • trash-list:列出回收站中清单
  • trash-restore:文件还原,需要在被删除的目录下使用,不然无效。
  • trash-empty:清空回收站(慎用或不用,除非空间不够)

Linux系统中的回收站默认路径为$HOME/.local/share/Trash

跟echo提示禁用一样,alias的方式,始终无法避免直接使用rm的绝对路径删除东西。

但这种方式比直接echo好一些,因为确实可以实现剪切,后面需要恢复的时候可以恢复;适用于自己平时使用rm命令,自己是可以控制不使用rm的绝对路径的,从而避免了误删除操作,需要真的删除的时候,定时进入回收站清空就可以,相当于cli版本的回收站,效果跟gui版本的回收站类似。

其他方式

  • 如果使用jumpserver,可以直接禁用rm命令
  • 使用脚本重定向rm的效果

常用命令之top

与 ps 命令相似,top 命令也可以显示进程信息,但采用的是实时方式。top与htop是很常用的命令,关于top的主要用法与理解,在此记录。

输出的第一部分显示的是系统概况:

第一行显示了当前时间、系统的运行时长、登录的用户数以及系统的平均负载。

平均负载有 3 个值,分别是最近 1 分钟、最近 5 分钟和最近 15 分钟的平均负载。值越大说明系统的负载越高。由于进程短期的突发性活动,出现最近 1 分钟的高负载值也很常见。但如果近 15 分钟内的平均负载都很高,就说明系统可能有问题了。

Linux 系统管理的难点在于定义究竟到什么程度才算是高负载。这个值取决于系统的硬件配置以及系统中通常运行的程序。某个系统的高负载可能对其他系统来说就是普通水平。最好的做法是注意在正常情况下系统的负载情况,这样将更容易判断系统何时负载不足。

第二行显示了进程(top 称其为 task)概况:多少进程处于运行、休眠、停止以及僵化状态 (僵化状态指进程已结束,但其父进程没有响应)。

下一行显示了 CPU 概况。

top 会根据进程的属主(用户或是系统)和进程的状态(运行、 空闲或等待)将 CPU 利用率分成几类输出。

紧跟其后的两行详细说明了系统内存的状态。

前一行显示了系统的物理内存状态:总共有多少内存、当前用了多少,以及还有多少空闲。后一行显示了系统交换空间(如果分配了的话)的状态。

最后一部分显示了当前处于运行状态的进程的详细列表,有些列跟 ps 命令的输出类似。

主要参数解释:

text
PID:进程的 PID。
USER:进程属主的用户名。
PR:进程的优先级。
NI:进程的谦让度。
VIRT:进程占用的虚拟内存总量。
RES:进程占用的物理内存总量。
SHR:进程和其他进程共享的内存总量。
S:进程的状态(D 代表可中断的休眠,R 代表运行,S 代表休眠,T 代表被跟踪或停止, Z 代表僵化 )。
%CPU:进程使用的 CPU 时间比例。
%MEM:进程使用的可用物理内存比例。
TIME+:自进程启动到目前为止所占用的 CPU 时间总量。
COMMAND:进程所对应的命令行名称,也就是启动的程序名。

在默认情况下,top 命令在启动时会按照%CPU 值来对进程进行排序,你可以在 top 命令运行时使用多种交互式命令来重新排序。

每个交互式命令都是单字符,在 top 命令运行时键入可改变 top 的行为。

键入 f 允许你选择用于对输出进行排序的字段,键入 d 允许你修改轮询间隔 (polling interval),键入 q 可以退出 top。

用户对 top 命令输出有很大的控制权。利用该工具, 你经常能找出占用系统大量资源的罪魁祸首。

主要参数的其他解释:

常用命令之df与du

人们经常会把df和du命令混淆,df是用于查看磁盘或分区使用情况的命令,而du命令则是用于按照指定容量单位来查看文件或目录在磁盘中的占用情况。

df命令

df 的结果可能比du出来的结果更大,就是因为删除后,还没释放空间。

du命令

du命令来自英文词组disk usage的缩写,其功能是查看文件或目录的大小。

du命令,主要就是-h和-s参数的使用,还可以做一些简单的统计。

当前目录下的文件和目录,按照大小排序:

bash
du -sh * | sort -rh

查看当前目录下的所有目录大小:

bash
du -h --max-depth=1

当前目录下,找出大小最大的20个目录

bash
du | \
sort -r -n | \
awk '{split("K M G",v); s=1; while($1>1024){$1/=1024; s++} print int($1)" "v[s]"\t"$2}' | \
head -n 20

常用命令之kill pkill

kill + pid | kill -9 + pid

kill 命令可以通过 PID 向进程发送信号。在默认情况下,kill 命令会向命令行中列出的所有 PID 发送 TERM 信号。

遗憾的是,你只能使用进程的 PID 而不能使用其对应的程序名,这使得 kill 命令有时并不好用。 要发送进程信号,必须是进程的属主或 root 用户。

TERM 信号会告诉进程终止运行。但不服管教的进程通常会忽略这个请求

如果要强制终止, 则-s 选项支持指定其他信号(用-s+信号名或-信号值)。 从下例可以看到,kill 命令不会有任何输出:

bash
kill -s HUP 3940
bash
kill -9 3940

要检查 kill 命令是否生效,可以再次执行 ps 命令或 top 命令,看看那些进程是否已经停止运行。

pkill 程序名 | 慎用通配符

pkill 命令可以使用程序名代替 PID 来终止进程,这就方便多了。除此之外,pkill 命令也允许使用通配符,当系统出问题时,这是一个非常有用的工具,比如:

bash
pkill http*

该命令将“杀死”所有名称以 http 起始的进程,比如 Apahce Web Server 的 httpd 服务。

以 root 身份使用 pkill 命令时要格外小心。命令中的通配符很容易意外地将系统的重要进程终止。这可能会导致文件系统损坏。

常用命令之whereis

显示命令及相关文件的路径位置

whereis 命令的功能是显示命令及相关文件的路径位置信息,可用于找到命令(二进制程序)、命令源代码、man 帮助手册等相关文件的路径位置信息,帮助我们更好地管理这些文件。

有别于 find 命令进行的全盘搜索,whereis 命令的查找速度非常快,因为它不是在磁盘中乱找,而是在指定数据库中查询,该数据库是 Linux 系统自动创建的,包含本地所有文件的信息,每天自动更新一次

但也正因为这样,whereis 命令的搜索结果会不及时,比如刚添加的文件可能搜不到,原因就是该数据库文件还没有更新,管理人员需手动执行updatedb命令进行更新。

常用命令之grep

grep

grep 命令来自英文词组 global search regular expression and print out the line 的缩写,意思 是用于全面搜索的正则表达式,并将结果输出。人们通常会将 grep 命令与正则表达式搭配使 用,参数作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活。

egrep 与 fgrep

与grep容易混淆的是 egrep 命令和 fgrep 命令。

如果把 grep 命令当作标准搜索命令, 那么 egrep 则是扩展搜索命令, 等价于 grep -E 命令, 支持扩展的正则表达式

而 fgrep 则是快速搜索命令,等价于 grep -F 命令,不支持正则表达式,直接按照字符串内容进行匹配

常用命令之history

history 是一个实用的内建命令,能帮助你管理先前执行过的命令。

历史记录中通常默认保存最近的 1000 条命令。可以设置保存在 bash 历史记录中的命令数量。为此,需要修改名为 HISTSIZE 的环境变量。

当输入!时,bash 会先显示从 shell 的历史记录中唤回的命令,然后再执行该命令。 命令历史记录被保存在位于用户主目录的隐藏文件.bash_history 之中。

!+ 行号 是执行第几行的的命令。

!!是执行历史记录中最后一条命令。

这里要注意的是,在 CLI 会话期间,bash 命令的历史记录默认被保存在内存中。当 shell 退出时 才被写入历史文件。 可以在不退出 shell 的情况下强制将命令历史记录写入.bash_history 文件。为此,需要使用 history 命令的-a 选项。

history -a

如果打开了多个终端会话,则仍然可以使用 history -a 命令在每个打开的会话中向 .bash_history 文件添加记录。

但是历史记录并不会在其他打开的终端会话中自动更新。

这是因为.bash_history 文件只在首次启动终端会话的时候才会被读取。

要想强制重新读取.bash_history 文件,更新内存中的终端会话历史记录,可以使用history -n命令。

常用命令之pidof

ps -ef | grep 进程名 类似,pidof 进程名 可以查看进程名对应的进程id。

用法注意:进程名是要全部匹配不能是模糊匹配,比如sshd,如果输入ssh就不会看有结果。

常用命令之sort

sort -n

sort -M

其他参数

慎重使用命令find

find 命令的功能是根据给定的路径和条件查找相关文件或目录,其参数灵活方便,且支持正则表达式,结合管道符后能够实现更加复杂的功能,是 Linux 系统运维人员必须掌握的命令之一。

find 命令通常进行的是从根目录(/)开始的全盘搜索,有别于 whereis、which、locate 等有条件或部分文件的搜索。

对于服务器负载较高的情况,建议不要在高峰时期使用 find 命令的模糊搜索,这会相对消耗较多的系统资源。