常用运维命令

Last Modified: 2023/08/10

概述

以下是程序员同学,特别是运维同学,经常会使用到的命令。以下使用 <xxx> 作为占位符,这是你在运行命令时应该根据实际情况替换的部分,而不是照抄!本文会持续更新其他的运维命令,欢迎收藏。

如果有不正确的地方,欢迎大家使用页面最下方的反馈按钮给作者反馈。

查看某个进程占用的内存

# 根据名称查找进程,这里以查找 nginx 为例
ps aufx|grep nginx
# 查看某个进程的内存使用情况
top -p <pid>
# 查看某个进程的状态,其中 VmRSS 表示物理内存使用量,单位 K
cat /proc/<pid>/status

查看进程打开的文件数

# 方法一
lsof -p <pid> | wc -l
# 方法二
ls -l /proc/<pid>/fd|wc -l

根据名称获取进程 pid

以下以查找 nginx 进程为例,以下四种方式都可以。

# 以查找 nginx 进程为例:
ps aufx|grep nginx|grep -v grep|awk '{print $2}'
# [] 防止匹配到awk自身进程
ps aufx|awk '/[n]ginx/{print $2}'
# 以查找 nginx 进程为例:
pgrep -f nginx
# 以查找 nginx 进程为例:
pidof nginx

根据进程名杀死进程

ps aufx|grep "<procname>"|grep -v grep|awk '{print $2}'|xargs kill -9
# 或者
ps aufx|awk '/[p]rocname/{print $2}'|xargs kill -9

来个例子,例如要杀死 tomcat 进程:

ps aufx|grep "tomcat"|grep -v grep|awk '{print $2}'|xargs kill -9
# 或者
ps aufx|awk '/[t]omcat/{print $2}'|xargs kill -9

注:kill -9 会强制杀死进程,温和一点的方式是去掉 -9。我们建议不要加 -9,毕竟营销号上天天有标题 “总监说下次再使用 xx,就直接滚蛋”。

查看端口占用

lsof -i:<port_number>
lsof -i:12345

# 先看进程id
netstat -anop|grep <port>
# 然后按c看到进程运行的命令
top -p <pid>

另一种方法:

#t=tcp,n=numeric,u=udp,l=listening,p=program
netstat -tunlp|grep <pid>

查看进程 pid/ppid/pgid/sid/comm/tty 等

tty表示控制终端。

ps -o pid,ppid,pgid,sid,tty,comm

根据 pid 找到可执行文件的位置

On Linux, the symlink /proc//exe has the path of the executable. Use the command readlink -f /proc//exe to get the value.

readlink -f /proc/<pid>/exe

可以先使用 grep 命令找到进程 pid,然后再使用上面的命令找到可执行文件的位置。

找进程的工作目录

pwdx <pid>
cd /proc/<pid>
ls -lh cwd
# 甚至可以看到exe
ls -lh exe

为什么进程挂了

dmesg | grep -i kill
grep /var/log/kern.log* -ie kill

The exact log file varies dependingon distribution and configuration, but if you do ls -ldrat /var/log/* it will show the most recently edited logfiles at the bottom. The files messages,dmesg and daemon are all likely sources of information.

为什么 root 也删除不了文件

可能是文件被锁定了。

# 查看属性
lsattr /path/to/file
# 解锁
chattr -i /path/to/file

查看文件夹下各个文件的大小

# 先cd到目标文件夹下
du -sh *|sort -h

查看某个文件夹的大小

# 先cd到目标文件夹下
du -sh

以其他用户的身份运行命令

# 就是su 加 -c
su - someotheruser -c "ls -lh"

查找目录下的 sparse file

find /path/to/search -type f -printf "%S\t%p\n" | gawk '$1 < 1.0 {print}'

查找被删除但是空间未释放的文件

# without lsof
find /proc/*/fd -ls | grep  '(deleted)'
# with lsof, +L1 means 'list files that have fewer than 1 link'
lsof -a +L1 <mountpoint>
# or
lsof +L1
# If it was already deleted, on Linux, you can still truncate it by doing:
: > "/proc/<pid>/fd/<fd>"

查总线程数

# 注意大写的L
ps -eLf|wc -l
# 查特定用户的线程数,也就是nproc
ps -Lfu <username>|wc -l

查看进程树

pstree -ahlps <pid>

可以先使用 ps 命令找到进程id,假设找到 tail 进程的 pid 为 9112,那么接下来就是使用 pstree 展示 tail 的进程树:

stree -ahlps 9112

在 ubuntu 系统输出结构如下:

systemd,1 splash
  └─systemd,4052 --user
      └─gnome-terminal-,4814
          └─zsh,8822
              └─tail,9112 -f /tmp/hello

统计 nginx access.log ip 访问次数

cat /path/to/access.log | awk '{print $1}' |sort|uniq -c|sort -rn

假设 nginx 日志的路径为 /usr/local/nginx/logs/access.log,想统计每个 ip 的访问次数并根据访问次数倒序排列,可以执行:

cat /usr/local/nginx/logs/access.log | awk '{print $1}' |sort|uniq -c|sort -rn
# 如果只想统计出前十名
cat /usr/local/nginx/logs/access.log | awk '{print $1}' |sort|uniq -c|sort -rn|head -10

统计的输出结果类似下面这样,每一行的第一个数字是访问次数,紧接着是访问者的 ip。

228 8.134.81.19
 78 52.167.144.125
 57 109.237.97.180
 52 117.140.247.59
 ...
有问题吗?点此反馈!

温馨提示:反馈需要登录