Linux常用运维命令
进程、线程
- 查找某个进程
$ ps aux --forest | grep 进程关键字
$ ps aux | grep pid
$ lsof -p pid
- 查看进程下的线程
$ top -H -p pid
文件
- 查看该文件被哪些进程使用
比如查看某个日志文件被哪些进程使用,业务应用+日志采集进程等
$ lsof 文件全路径名
- 查看文件信息情况
$ stat 文件名
- 文件行数
$ wc -l 文件名
# 该文件夹下所有文件的各个行数
$ wc -l *
- 查找大文件
# /opt告警,遍历/opt下3层目录,从大到小排序显示前10个目录文件的大小
$ du -h /opt/ --max-depth=3 2>/dev/null | sort -rh | head
# /告警,遍历/下2层目录
$ du -h / --max-depth=2 2>/dev/null | sort -rh | head
# ls文件夹 文件大小排序
$ ls -lhS
# 查找某目录下具体大文件
$ find /docker/opt/logs -size +200M
系统调用
- 跟踪某个进程的系统调用
$ strace -p pid
$ strace command
网络
- 查看端口情况
$ netstat -anp | grep port
- 修改网络包转发
# 80端口的tcp消息转发给8899端口上
$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8899
- 查看域名cname、A记录
$ dig www.baidu.com
;; ANSWER SECTION:
www.baidu.com. 849 IN CNAME www.a.shifen.com.
www.a.shifen.com. 261 IN A 110.242.68.4
www.a.shifen.com. 261 IN A 110.242.68.3
$ sudo tcpdump -i eth1 -s0 -v -n -l -A host 124.64.123.235 and port 80
- curl
$ curl -iv https://www.baidu.com -H 'Accept: application/json, text/plain, */*' \
-w 'time_connect %{time_connect}\ntime_starttransfer %{time_starttransfer}\ntime_total %{time_total}\n'
curl -h 查看几个常用参数:
参数 | 含义 |
---|---|
-i | 输出包含响应头header |
-v | 使得curl过程可读性更好 |
-H | 请求带上自定义的header信息 |
-d | post data |
-I | 只输出响应头 |
-s | 安静模式 |
-w | 输出属性,如统计耗时 |
- nc
nc 发送tcp或者udp请求,做一个测试用的简易客户端比较方便。也可以扫描服务端口用(nmap工具更合适)。
$ nc -z -v ip port
nc当一个简易的聊天server也可以
# 监听指定端口
$ nc -l port
# client过来,指定上述机器ip+port
$ nc ip port
系统
- 内存使用情况
$ free -h
$ free -g
- 磁盘使用情况
$ df -h
- 系统资源各进程占用情况
$ top
- 按shift+p cpu占用排序
- 按shift+m 内存占用排序
- 按shift+h 所有线程
Java
- jps 查看java进程
前提:需要当前账号有权限查看启动的进程
# 查看较全的java进程命令,更好识别
$ jps -l
#查看虚拟机启动时的JVM参数
$ jps -v
- jstat 虚拟机统计信息监视工具
显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据
$ jstat [ option vmid [interval[s|ms] [count]] ]
# 1. 查看进程2764的gc信息,250ms查询一次,共查20次
$ jstat -gc -h20 2764 250 20
# 2. 查看已用空间和占比
$ jstat -gcutil 2764
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 6.20 41.42 47.20 16 0.105 3 0.472 0.577
查询结果表明:这台服务器的新生代Eden区(E,表示Eden)使用了6.2%的空间,2个Survivor区 (S0、S1,表示Survivor0、Survivor1)里面都是空的,老年代(O,表示Old)和永久代(P,表示 Permanent)则分别使用了41.42%和47.20%的空间。程序运行以来共发生Minor GC(YGC,表示Young GC)16次,总耗时0.105秒;发生Full GC(FGC,表示Full GC)3次,总耗时(FGCT,表示Full GC Time)为0.472秒;所有GC总耗时(GCT,表示GC Time)为0.577秒。
- jinfo 配置信息工具,实时查看和调整虚拟机各项参数
使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项 进行查询
$ jinfo pid
- jmap Java内存映像工具
用于生成堆转储快照(一般称为heapdump或dump文件)。如果不使用jmap命令,要想获取Java堆转储快照也还有一些比较“暴力”的手段:-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成堆转储快照文件,又或者在Linux系统下通过Kill-3命令发送进程退出信号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。
jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
# jmap dump文件
$ jmap -dump:format=b,file=wws-heap2.hprof pid
查看当前类和对象信息 按内存占用排序,GC排查时常用
# 包含未回收的垃圾
$ jmap -histo pid |more
# 只看有用对象
$ jmap -histo:live pid
num #instances #bytes class name
----------------------------------------------
1: 52531168 1680997376 java.util.ArrayList$Itr
2: 615656 75433192 [C
3: 79558 57498864 [I
4: 610640 14655360 java.lang.String
Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
$ jmap -heap pid
这个命令线上机器慎用,导致cpu利用率飙升,影响服务稳定
- jstatck 线程快照查看
生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源
$ jstack -l pid
$ jstack pid | grep 线程名字
# 死锁情况
$ jstack pid | grep -i deadlock -A 20
- jhat
jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。
jhat分析比较入门级别了
$ jhat xx.hdump
- jvisualvm
查看java进程运行情况。shell中执行它会调起内置visualvm程序,连接java进程查看
$ jvisualvm
PHP
- 校验某个脚本语法是否正确
$ php -l xxx.php
- shell上执行php命令
$ php -r code
# 执行打印 phpinfo()
$ php -r 'phpinfo();'
- 重启php-fpm
php-fpm master进程接收信号,管理worker进程
信号 | 含义 |
---|---|
INT, TERM | 立刻终止 |
QUIT | 平滑终止 |
USR1 | 重新打开日志文件 |
USR2 | 平滑重载所有worker进程并重新载入配置和二进制模块 |
# 1. 找到php-fpm master进程
$ ps aux | grep php-fpm | grep master
# 2. 给master进程发信号
$ kill -USR2 pid
NGINX
查看nginx 常用参数
$ nginx -h
常用参数 | 含义 |
---|---|
-t | 查看配置文件语法等是否有问题 |
-s signal | 给主进程发信号 stop, quit, reopen, reload |
-p prefix | 设置nginx目录前缀 default: /usr/local/nginx/ |
-c filename | 指定配置文件启动,默认conf/nginx.conf |
- 指定某个配置文件启动
如果不用nginx默认目录下的配置文件,可以自己指定。如果机器上有多个nginx服务,可以指定下配置区分
$ nginx -c /xxx/nginx.conf
- 改了配置 验证下配置文件语法是否正常
$ nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
- 平滑重启、停止
$ nginx -s reload
# 停止
$ nginx -s stop
MySQL
- shell客户端登录
$ mysql -h192.168.1.100 -P3306 -uusername -ppassword --database databaseName -A
- mysqldump备份表到sql文件
$ mysqldump -h192.168.1.100 -uuser -p123 database_name table_name --single-transaction > /tmp/table_name_dump.sql
- 导出查询结果到文件
$ mysql -h110.11.111.21 -uxx -pxx -Pxx -D database_name -e "sql语句" > /tmp/result.log