Linux进阶命令

来源:互联网 发布:数控车床电脑编程软件 编辑:程序博客网 时间:2024/06/08 02:09

当我们熟悉一定的基础命令时,我们往往会接触到一些高级的命令操作,或者说是陌生的命令操作。

0x01 程序构建

一般源代码提供的程序安装需要通过配置、编译、安装三个步骤;
配置:
①要安装软件的依赖关系
②设置程序安装所需要的初始化信息,比如安装路径,需要安装哪些组件
③配置完成,会生成makefile文件供第二步make使用
编译:是对源文件进行编译链接生成可执行程序;
安装:做的工作就简单多了,就是将生成的可执行文件拷贝到配置时设置的初始路径下;
1.1. 配置
查询可用的配置选项: #./configure --help
配置路径: #./configure --prefix=/usr/local/snmp
–prefix是配置使用的最常用选项,设置程序安装的路径;
1.2. 编译
编译使用make编译: #make -f myMakefile
$@目标文件名
@^所有前提名,除副本
@+所有前提名,含副本
@<一个前提名
@?所有新于目标文件的前提名
@*目标文件的基名称
编译依赖的库
makefile编译过程中所依赖的非标准库和头文件路径需要显示指明:
CPPFLAGS -I标记非标准头文件存放路径
LDFLAGS -L标记非标准库存放路径
make -f myMakefile LDFLAGS='-L/var/xxx/lib -L/opt/mysql/lib'
CPPFLAGS='-I/usr/local/libcom/include -I/usr/local/libpng/include'
g++编译


应用:查询宏展开的中间文件:
在g++的编译选项中,添加 -E选项,然后去掉-o选项 ,重定向到一个文件中即可:
g++ -g -E unixApp.cpp -I/opt/app/source > midfile
1.3. 安装
安装做的工作就简单多了,就是将生成的可执行文件拷贝到配置时设置的初始路径下:
$make install

 

0x02 程序调试

2.1. 进程调试
gdb 程序交互调试
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
对于一名Linux下工作的c++程序员,gdb是必不可少的工具;
启动gdb $g++ -g hello.cpp -o hello
调试可执行文件: #gdb
调试服务程序:
$gdb
$gdb hello 11127
以下从一个完整的调试过程简单说明最基本的几个命令;
$gdb programmer # 启动gdb
>break main # 设置断点
>run # 运行调试程序
>next # 单步调试
>print var1 # 在调试过程中,我们需要查看当前某个变量值的时候,使用print 命令打印该值
>list # 显示当前调试处的源代码
>info b # 显示当前断点设置情况
同时,你需要更高效的调试:常用的调试命令都会有单字符的缩写,使用缩写更方便;同时,直接敲回车表示重复执行上一步命令;这在单步调试时非常有用;
pstack 跟踪栈空间 #pstrack
strace常用来跟踪进程执行时的系统调用和所接收的信号。用户态模式切换至内核态模式
跟踪28979进程的所有系统调用,并统计系统调用的花费时间,以及开始时间(以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面
#strace -o output.txt -T -tt -e trace=all -p 28979
查看进程正在做什么(实时输出进程执行系统调用的情况)#strace -p
2.2. 目标文件分析
nm --用来列出目标文件的符号清单。
$nm myProgrammer
正文段--可执行代码的段;,数据段--不可执行的信息或数据; BSS 段--以符号数据开头的块
nm命令列出的每个符号,它们的值使用十六进制来表示(缺省行为),并且在该符号前面加上了一个表示符号类型的编码字符。常见的各种编码包括:
A 表示绝对 (absolute),这意味着不能将该值更改为其他的连接;
B 表示 BSS 段中的符号;
C 表示引用未初始化的数据的一般符号。
objdump 显示二进制文件的信息,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息
#objdump -d myprogrammer
常用参数说明
-f 显示文件头信息
-D 反汇编所有section (-d反汇编特定section)
-h 显示目标文件各个section的头部摘要信息
-x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于 -a -f -h -r -t 同时指定。
-i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。
-r 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。
-R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。
-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。
-t 显示文件的符号表入口。类似于nm -s提供的信息
查看本机目标结构(使用大端还是小端存储):$objdump -i
反汇编程序:$objdump -d main.o
显示符号表入口:$objdump -t main.o


readelf
$readelf -all a.out
$readelf --debug-dump a.out | more
size 查看程序内存占用
#top
#whereis fcitx
#size /usr/bin/fcitx
file 文件类型查询
$file core.22355
strings 查询数据中的文本信息
一个文件中包含二进制数据和文本数据,如果只需要查看其文本信息,使用这个命令就很方便;过滤掉非字符数据,将文本信息输出:$strings
显示所有正在使用着指定的file, file system 或者 sockets的进程信息;
fuser 显示文件使用者
显示所有正在使用着指定的file, file system 或者 sockets的进程信息;
$fuser -m -u redis-server
fuser通常被用在诊断系统的”resource busy”问题。如果你希望kill所有正在使用某一指定的file, file system or sockets的进程的时候,你可以使用-k选项:
$fuser –k /path/to/your/filename


xxd 十六进制显示数据
#xxd /root/Desktop/1
od
通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。
参数说明:
-A 指定地址基数,包括:
d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值
-t 指定数据的显示格式,主要的参数有:
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制(系统默认值为02)
u 无符号十进制数
x 十六进制数
$od -Ax /root/Desktop/1


0x03 性能优化

 

从系统层面和程序层面进行性能优化。
3.1. 分析系统瓶颈 ---top 命令
系统响应变慢:IO瓶颈、CPU瓶颈、内存瓶颈、程序导致的系统问题
使用top工具能够比较全面的查看我们关注的点:#top
进入交互模式后:
输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用者使用有问题(检测内存泄漏问题);
输入P,进程列表按CPU使用大小降序排序,便于我们观察最耗CPU资源的使用者是否有问题;
top第三行显示当前系统的,其中有两个值很关键:
%id:空闲CPU时间百分比,如果这个值过低,表明系统CPU存在瓶颈;
%wa:等待I/O的CPU时间百分比,如果这个值过高,表明IO存在瓶颈;
3.2. 分析内存瓶颈 --free命令
一 使用free 命令
#free -mh
二 使用vmstat 命令
vmstat是Virtual Meomory 可实时动态监视操作系统的虚拟内存、进程、CPU活动。
vmstat [-V] [-n] [delay [count]]
-V表示打印出版本信息;
-n表示在周期性循环输出时,输出的头部信息仅显示一次;
delay是两次输出之间的延迟时间;
count是指按照这个时间间隔统计的次数。
/root$vmstat 5 5
procs -----------------memory-----------------------swap-- -----------io--------- -system-- ---------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 5524 172304 178400 969340 0 0 8 29 50 146 1 0 98 1 0
0 0 5524 172252 178400 969348 0 0 0 0 378 1089 19 3 78 0 0
3 0 5524 170888 178412 969352 0 0 0 31 636 1460 38 6 56 0 0


Procs Memory Swap system:
r:运行队列中进程数量 swpd:使用虚拟内存大小 si:每秒从交换区写到内存的大小 in: 每秒中断数,包括时钟中断
b:等待IO的进程数量 free:可用内存大小 so:每秒写入交换区的内存大小 cs: 每秒上下文切换数
buff:用作缓冲的内存大小 IO:现在Linux版本块的大小为1024b CPU(以百分比表示)
cache:用作缓存的内存大小 bi:每秒读取的块数 us: 用户进程执行时间
bo:每秒写入的块数 sy: 系统进程执行时间
id: 空闲时间(包括IO等待时间)
wa: 等待IO时间
3.3. 分析IO瓶颈
如果IO存在性能瓶颈,top工具中的%wa会偏高;
进一步分析使用iostat工具:root$iostat -d -x -k 1 1
如果%iowait的值过高,表示硬盘存在I/O瓶颈。
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
如果avgqu-sz比较大,也表示有大量io在等待。
3.4. 分析进程调用--pstack和pstrace
pstack用来跟踪进程栈,这个命令在排查进程问题时非常有用
查看bash程序进程栈:/opt/app/tdev1$ps -fe| grep bash
strace用来跟踪进程中的系统调用;这个工具能够动态的跟踪进程执行时的系统调用和所接收的信号。是一个非常有效的检测、指导和调试工具。系统管理员可以通过该命令容易地解决程序问题。
$strace cat /dev/null
命令实例1:
跟踪可执行程序
strace -f -F -o ~/straceout.txt myserver
-f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到~/straceout.txt里 面,myserver是要启动和调试的程序。


跟踪服务程序
strace -o output.txt -T -tt -e trace=all -p 28979
跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。


3.5. 优化程序代码
编完代码,再优化
精力集中在优化那20%最耗时的代码上
gprof使用步骤
用gcc、g++、xlC编译程序时,使用-pg参数,如:g++ -pg -o test.exe test.cpp编译器会自动在目标代码中插入用于性能测试的代码片断,这些代码在程序运行时采集并记录函数的调用关系和调用次数,并记录函数自身执行时间和被调用函数的执行时间。
执行编译后的可执行程序,如:./test.exe。该步骤运行程序的时间会稍慢于正常编译的可执行程序的运行时间。程序运行结束后,会在程序所在路径下生成一个缺省文件名为gmon.out的文件,这个文件就是记录程序运行的性能、调用关系、调用次数等信息的数据文件。
使用gprof命令来分析记录程序运行信息的gmon.out文件,如:gprof test.exe gmon.out则可以在显示器上看到函数调用相关的统计、分析信息。上述信息也可以采用gprof test.exe gmon.out> gprofresult.txt重定向到文本文件以便于后续分析。


3.6. 其它工具
调试内存泄漏的工具valgrind,感兴趣的朋友可以google了解;
OProfile: Linux 平台上的一个功能强大的性能分析工具,使用参考 [f2] ;
除了上面介绍的工具,还有一些比较全面的性能分析工具,比如sar(Linux系统上默认不安装,需要手动安装下); 将sar的常驻监控工具打开后,能够收集比较全面的性能分析数据;
 

:0x04 llsof 一切皆文件

list open files是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息
lsof打开的文件可以是:
普通文件
目录
网络文件系统的文件
字符或设备文件
(函数)共享库
管道,命名管道
符号链接
网络文件(例如:NFS file、网络socket,unix域名socket)
还有其它类型的文件,等等
命令参数
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
实例1:无任何参数$lsof| more
lsof输出各列信息的意义如下:


COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等:


(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
(3)lnn:library references (AIX);
(4)er:FD information error (see NAME column);
(5)jld:jail directory (FreeBSD);
(6)ltx:shared library text (code and data);
(7)mxx :hex memory-mapped type number xx.
(8)m86:DOS Merge mapped file;
(9)mem:memory-mapped file;
(10)mmap:memory-mapped device;
(11)pd:parent directory;
(12)rtd:root directory;
(13)tr:kernel trace file (OpenBSD);
(14)v86 VP/ix mapped file;
(15)0:表示标准输出
(16)1:表示标准输入
(17)2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁
(1)N:for a Solaris NFS lock of unknown type;
(2)r:for read lock on part of the file;
(3)R:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分写锁)
(5)W:for a write lock on the entire file;(整个文件的写锁)
(6)u:for a read and write lock of any length;
(7)U:for a lock of unknown type;
(8)x:for an SCO OpenServer Xenix lock on part of the file;
(9)X:for an SCO OpenServer Xenix lock on the entire file;
(10)space:if there is no lock.
TYPE:文件类型,如DIR、REG等,常见的文件类型:
(1)DIR:表示目录
(2)CHR:表示字符类型
(3)BLK:块设备类型
(4)UNIX: UNIX 域套接字
(5)FIFO:先进先出 (FIFO) 队列
(6)IPv4:网际协议 (IP) 套接字
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
查找某个文件相关的进程$lsof /bin/bash
实例3:列出某个用户打开的文件信息$lsof -u username
实例4:某个程序进程所打开的文件信息$lsof -c mysql
实例5:列出某个用户以及某个进程所打开的文件信息$lsof -u test -c mysql
实例6:通过某个进程号显示该进程打开的文件$lsof -p 11968
实例7:列出所有的网络连接$lsof -i
实例8:列出所有tcp 网络连接信息$lsof -i tcp $lsof -n -i tcp
实例9:列出谁在使用某个端口 $lsof -i :3306
实例10:列出某个用户的所有活跃的网络端口$lsof -a -u test -i
实例11:根据文件描述列出对应的文件信息$lsof -d description(like 2)
实例12:列出被进程号为1234的进程所打开的所有IPV4 network files
$lsof -i 4 -a -p 1234
实例13:列出目前连接主机nf5260i5-td上端口为:20,21,80相关的所有文件信息,且每隔3秒重复执行
lsof -i @nf5260i5-td:20,21,80 -r 3
0 0
原创粉丝点击