linux服务器管理

linux服务器管理 常用命令

常用工具介绍

综合功能

名字 简介
lsof 扫描已经打开的文件(宽泛)
top 查看进程活动状态以及一些系统状况
sar 查看系统状况
iostat 查看CPU 负载,硬盘状况
vmstat 查看系统状态、硬件和系统信息等
mpstat 与 vmstat 功能相似,但可以查看多处理器状况
dstat 综合了 vmstat, iostat, ifstat, netstat 等多个信息 - 推荐
pidstat 进程和内核线程的统计信息,支持IO和页面信息
glacne
ps 进程的一些信息
nmon 非常好的第三方监控工具,方便输出报表
dbf hp-unix

单项功能

名字 简介
slabtop 实时展示内核slab模块所管理的各种缓存对象资源信息;
sysdig 系统内核态和网络和I/O的监控利器(综合)
free 内存信息
ipcs 查看进程间通信情况 消息队列,共享内存,信号量等信息
lscpu 简要描述 CPU 信息-第三方,已经合并到 util-linux
strace 内核态的函数调用跟踪用
ltrace 用户态的函数调用跟踪用
dmesg 内核级信息,如启动时的驱动加载情况,设备起停,硬件插拔,网卡起停,网卡丢包等情况
iotop 很不错的 io 监控软件
lsblk 块设备信息,分区/CD 等
swapinfo
nfsstat

资源监控

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 综合查看
dstat -talpm --socket --tcp

# 获取占用CPU资源最多的10个进程
ps aux|head -1;ps aux|sort -k 3 -nr| head -10

# 查看CPU使用情况,按占用时间排序
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu

# 占用内存资源最多的10个进程
ps aux|head -1;ps aux | sort -rn -k 4 | head -10

dstat -tamp
dstat --top-io --top-bio            # disk io process show
dstat -d -r --top-io --top-bio

iotop           # 进程级别IO监控
iotop -o        # 只显示有IO操作的进程

setcap 访问控制

1
2
3
4
5
# 允许普通用户抓包
setcap cap_net_raw=eip  /usr/sbin/tcpdump

# 允许普通进程监听80端口(需要nginx restart, 而不是 reload)
setcap cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx

系统环境变量

1
2
3
4
5
6
7
8
9

# 高优先级的动态库路径
LD_PRELOAD=$HOME/lib

# 一般优先级动态库路径
LD_LIBRARY_PATH=$HOME/lib

# 时区
TZ="Asia/Shanghai"

selinux

1
2
3
4
5
6
7
8
9
getenforce      # 获取状态
setenforce 0    # 暂时关闭,即  permissive 状态,只对当前的会话有效
setenforce 1    # 恢复开启,即 Enforcing 状态

sestatus -v     # 查看selinux状态
getenforce      # 查看selinux模式

semanage port -l                                # 查看selinux端口限制规则
semanage port -a -t http_port_t -p tcp 8000     # 在selinux中注册端口类型

shell

终端操作

1
2
tty                     # 查看当前处于哪个虚拟终端
!$                      # 上一条指令的最后一个单词

快捷键

1
ctrl + \                # 强制退出当前命令的执行,有时执行ctrl + c无用时采用

常用单行语法

1
2
3
4
5
6
7
8
9
date +%s                            # 1538725423 输出unix时间戳
date +%s -d '1990-01-01 01:01:01'   # 指定时间的时间戳

date +'%F %T'                   2016-11-09 02:06:16
date +"%Y-%m-%d %H:%M:%S"       2016-11-09 02:06:16


date >out.log 2>&1              # 标准输出+错误输出 一起重定向
date &> out.log                 # 标准输出+错误输出 一起重定向  推荐方式

shell脚本模板头部

1
2
3
4
#!/bin/bash

WORKDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd ${WORKDIR}

用户管理

1
2
3
4
5
6
gpasswd -a user_name wheel          # 添加用户到某组

echo "pw" | passwd user --stdin     # 非交互修改密码
echo "pw" | sudo -S ls /tmp         # 非交互式使用 sudo

su - user -c "cmd1; "               # 切换用户执行命令

踢出用户

1
2
3
4
5
6
7
8
9
w
pkill -kill -t tty1

# 剔除用户
# 或者使用 pstree 查看 sshd 的进程数,判断所属进程后 kill 即可
# 注意, 用户正常退出时, 其启动的进程会自动移交给 init;
# 但如果 kill 这个用户, 会将信号传递给其启动的进程
# 于是会导致用户 使用此命令时 会将此用户启动的进程也非正常结束掉
# 进程没有收到信号, 却死了

密码相关

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
passwd -l user_name             # 禁用账号(不能阻止私钥登陆)
usermod -L user_name            # 禁用账号(不能阻止私钥登陆)

passwd -u user_name             # 解锁用户
passwd -S user_name             # 查看用户密码状态

chage -E0 user_name             # 设置用户密码立即过期(私钥也不能登陆)
chage -E-1 user_name            # 设置用户密码未过期(恢复原密码过期时间)


# 检查所有用户的密码到期日期
for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; done | paste -d " "  - - | sed 's/Password expires//g'

# 除系统用户外的所有用户的密码有效期
for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; done | paste -d " "  - - | sed 's/Password expires//g' | grep -v "never"

登录审计

1
2
3
4
5
6
7
8
9
last                        # 查看登陆过的用户信息
who /var/log/wtmp           # 查看登陆过的用户信息
lastlog                     # 用户最后登录的时间
lastb -a                    # 列出登录系统失败的用户相关信息

who                         # 当前在线用户
w                           # 当前在线用户
whoami                      # 查看当前用户名
logname                     # 查看初始登陆用户名

systemd

1
2
3
4
systemctl daemon-reload     # 重载所有修改过的配置文件

# 一次性输出、不进入交互式翻页
systemctl --no-pager status node_exporter -l

日志管理 - journalctl

1
2
3
4
journalctl --since=yesterday
journalctl --since='2024-01-25 10:00'   # 指定时间开始的日志

journalctl -b -1                        # 查看上一次启动的日志(需更改设置)

硬件相关

cpu

1
2
3
4
5
6
7
8
lscpu                                   # 查看cpu信息
more /proc/cpuinfo
grep name /proc/cpuinfo | cut -f2 -d: | uniq -c    # 查看cpu型号和逻辑核心数
getconf LONG_BIT                                         # cpu运行的位数
grep 'physical id' /proc/cpuinfo|sort| uniq -c    # 物理cpu个数

# 查看cpu指令集: pae 支持半虚拟化  IntelVT 支持全虚拟化
grep flags /proc/cpuinfo

内存

1
2
3
4
more /proc/meminfo          # 查看内存信息

# 查看内存插槽和大小
dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range

硬件综合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
dmesg

lspci                                   # 查看硬件信息
lspci|grep RAID                         # 查看是否支持raid
lspci -vvv |grep Ethernet               # 查看网卡型号
lspci -vvv |grep Kernel|grep driver     # 查看驱动模块
ethtool -i eth0                         # 查看网卡驱动版本

dmidecode                               # 查看全面硬件信息
dmidecode | grep "Product Name"         # 查看服务器型号

cat /proc/mdstat            # 查看软raid信息
cat /proc/scsi/scsi         # 查看Dell硬raid信息(IBM、HP需要官方检测工具)

modinfo name            # 查看驱动版本(驱动模块)
ethtool -i em1          # 查看网卡驱动版本

事件

drop_caches 管理

1
2
3
4
# 清理内存
echo 2 > /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/drop_caches
echo 0 > /proc/sys/vm/drop_caches

常用shell别名

1
2
3
alias ll='ls -l --time-style=long-iso'
alias ag='rg'
alias dsync='rsync -avuP --delete'

系统脚本

1. 系统自检查脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# 主机登录后的常规检查项目, 可以放在 /etc/profile.d 里登录自动运行

df -Th

# 对于小容量的云服务器, 还是有必要检查一下 inode 使用率
df -ih

free -h

uptime; echo; cat /proc/loadavg

# top5 cpu
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 6

ss -s

# 最近200条错误级别的日志
journalctl -p 3 -n 200 --no-pager

包管理工具

rpm

1
2
3
4
rpm -qf     /bin/file2  # 查询文件归属包
rpm -ivh xxxx.rpm

rpm2cpio xxx.rpm |cpio -div     # 解压

yum

1
yum makecache           # 更新缓存

deb

1
ar              # 解压 deb

常用系统包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 开发工具开发库
gcc gcc-c++ make autoconf automake m4 libtool
ncurses ncurses-devel

# 网络工具包
telnet lftp curl wget lrzsz ntpdate

# 文件管理
xz zip unzip dos2unix

# 系统工具
dstat lsof sysstat
bash-completion

磁盘管理

工具列表

名字 简介
df 容量检查
sfdisk 非交互式实现 fdisk 的功能
blkid 查看文件系统卷标,uuid,type等基础信息
fsck 文件系统修复
e2fsck
e2image
e2label
mkfs
dumpe2fs

查看信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19

# 查看目录大小
du -sh ./*

# 查看路径下各文件的大小,包含隐藏文件
shopt -s dotglob; du -sh ./*

# 检测分区使用量大于 50% 的空间
df -h | grep '[5-9][0-9]%'

df -Ph              # 查看硬盘容量, 约束到一排显示


# 检查磁盘性能
iostat -x -d -k 1 10

iotop

lsblk -f            # 列出所有的块设备

基础管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 卷标
e2label device [新卷标]
e2label /dev/sdb1 /sdb1

fsck -y /dev/sda6   # 对文件系统修复

# 文件系统修复类命令
fsck
fsck.cramfs
fsck.ext2
fsck.ext3
fsck.msdos
fsck.vfat

扩容

1
2
3

# 重新扫描磁盘
echo 1 > /sys/block/sda/device/rescan

lvm扩容磁盘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
parted /dev/sda

resizepart 3 100%

# 扩容对应的pv大小
pvresize /dev/sda3

# lv
lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
lvresize -l +41163 /dev/vg_00/root      # 增加 n 个 PE 至某LV

# 动态调整分区大小
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/vg_00/root

无lvm扩容磁盘

1
2
3
4
5
6
7
8
# parted /dev/vda resizepart 3 400GB

parted /dev/vda

resizepart 3 100%

# 直接扩容
parted /dev/sda resizepart 3 100%

aws ec2 扩容磁盘

1
2
3
4
5
6
7
8
lsblk
nvme0n1      259:0    0   300G  0 disk
├─nvme0n1p1  259:1    0 199.9G  0 part /
├─nvme0n1p14 259:2    0     4M  0 part
└─nvme0n1p15 259:3    0   106M  0 part /boot/efi

growpart /dev/nvme0n1 1         # 调整基础磁盘分区
resize2fs /dev/nvme0n1p1        # ext4 文件系统

挂载管理

1
2
3
4
5
# 挂载给普通用户
mount -o uid=1000,gid=1000 /dev/sdc1 /data/share_smb/wait/hddDisk

# 挂载iso
mount -t iso9660 -o loop /home/iso/rhel5.iso /mnt/iso/

iscsi 管理

存储端

1
2
# 服务器增加访问服务器
tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.27.10.24

客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 发现
iscsiadm -m discovery -t sendtargets -p 10.27.10.22:3260

# login
iscsiadm -m node -T iqn.ngca.com.20180308:disk1 -p 10.27.10.22:3260 -l

# logout
iscsiadm -m node -T iqn.ngca.com.20180308:disk1 -p 10.27.10.22:3260 -u

# delete
iscsiadm --mode node -o delete -T iqn.ngca.com.20180308:disk1 -p 10.27.10.22:3260

# 查看本地已经发现的存储
iscsiadm -m node

事件排查分析

基础信息

1
2
3
4
5
6
pidof program           # 查看某名称进程的pid

pstack pid                  # 前运行时的堆栈

kill $(pgrep program_name)
kill -9 $(ps -ef | grep proc_name | grep -v grep | awk '{print $2}')

ps

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
ps -o nlwp -p 463133        # 查看线程数
ps -mfL <PID>               # 查看进程的线程

# 查看某进程的 启动时间 - 运行时长(占用CPU的时间)
ps -ef|grep -v grep|grep -w chrome|awk '{print $1, $2, $5, "-", $7}'

ps -eo pid,lstart,etime,args         # 查看进程启动时间


# 自定义输出格式
ps -eo pid,lstart,etime
ps -eo user,pid,ppid,lstart,etime,stat,size,exe
ps -eo user,pid,ppid,lstart,etime,stat,size,cmd | grep java

# 查询僵尸进程
ps aux | awk '{print $8}' | grep 'Z'
ps -lfe | awk '{print $2}' | grep ^Z
ps -ef | grep defunct

# 按内存占用大小排序进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

top

1
top -H -p <pid>             # 显示某进程的线程情况 | top -Hp <pid>

线程信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

# 统计进程的线程信息
pstree -p 7001 | wc -l
grep Threads /proc/7001/status
top -bH -d 3 -p 7001
ps -eLf | grep 3322                             # 查询某进程的线程信息

ls -l /proc/<pid>/task/ | wc -l                 # 进程的线程数
ls -l /proc/<pid>/fd/ | wc -l                   # 进程打开的文件描述符数

/usr/sbin/lsof -n |awk '{print $2} " " $3'|sort|uniq -c |sort -nr|more

ps -eLo ruser | awk 'NR>1' | sort | uniq -c     # 统计 real user的进程线程数

ps -elfT | wc -l            # 统计系统当前启动的进程/线程总数

cat /proc/1369/environ |tr -s '\0' '\n'         # 查看某个进程启动的信息

strace

用户态的函数调用跟踪用

1
2
ltrace -p pid
ltrace -p 15547 -T -s 51200 -S -r -i -c

内核态的系统调用跟踪用

1
2
3
4
5
6
7
8
9
strace
strace -c -f -p 18775       # 输出汇总统计
strace -T -t -f -p 15545    # 查看进程详细动作

strace -fp 5211 -e trace=open,stat,close,unlink
                            # 跟踪指定动作

## -f表示跟踪子进程和子线程,-T表示显示系统调用的时长,-tt表示显示跟踪时间
strace -f -T -tt -p ${Pid} -o trace.log

综合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

dstat -tampl

pidstat -w          # 统计进程自愿/非自愿上下文切换

sar -r              # 查看历史期间 内存/SWAP 的使用情况
sar -P ALL 2 10

dmesg               # 显示开机信息

lsmod               # 查看内核模块
uptime              # 查看服务器启动时间

ldd                 # 查看程序的动态链接库
pldd

el6

1
2
# 查看自启动服务 - el6
chkconfig --list | awk '{if ($5=="3:on") print $1}'

文件

1
2
3
4
/usr/sbin/lsof | wc -l
/usr/sbin/lsof | grep lim
lsof |grep delete                   # 查看处于删除状态的进程
ulimit -a | grep open
Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2023-02-10 00:00 UTC