Linux命令

1 基本命令

缩写含义

-e filename  如果filename存在,则为真
-d filename 如果 filename为目录,则为真 
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真 
-w filename 如果 filename可写,则为真 
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
-r dictory   递归目录下的文件
-f dictory   不询问执行操作

参考链接:Linux:-e、-d、-f、-L、-r、-w、-x、-s、-h、

1.1 关机和重启

-h:停止服务并关机
-r:停止服务后重启

关机

shutdown -h now        立刻关机
shutdown -h 5        5分钟后关机
poweroff            立刻关机

重启

shutdown -r now        立刻重启
shutdown -r 5        5分钟后重启
reboot                立刻重启

1.2 帮助

--help命令
  shutdown --help:
  ifconfig  --help:查看网卡信息
 
man命令(命令说明书) 
  man shutdown
  注意:man shutdown打开命令说明书之后,使用按键q退出

1.3 查看资源占用情况

查看资源占用情况
ps(process status)

ps -au  占用的资源是从进程启动开始,计算的平均占用资源,比如cpu等,要杀死某个进程,可使用kill [pid]
top      实时占用的资源;

查看进程:

命令:ps -ef    查看所有正在运行的进程
ps -ef | grep nginx            查看nginx相关的进程,grep命令是查找
ps aux  是用标准格式显示进程

在这里插入图片描述
在这里插入图片描述

查看目录所占存储情况
du(disk usage)

du -lh     查看当前文件下各文件夹占用存储空间
du -sh      查看当前文件夹所占存储空间
du -h 目录路径   查看指定目录的存储情况
du --max-depth=<目录层数>     超过指定层数的目录后,予以忽略。
du --max-depth=1                 只查看当前目录下文件占用的存储空间

查看Linux 系统上的文件系统磁盘使用情况统计查看:df -h

查看CPU核:

cat /proc/cpuinfo

参考链接:【Linux】ps -ef|grep详解

1.4 SSH远程登录命令

SSH

1.ssh 192.168.1.100         默认利用当前宿主用户的用户名登录
2.ssh root@192.168.1.100      利用远程机的用户登录
3.ssh root@192.168.1.100  -o stricthostkeychecking=no   首次登陆免输yes登录
4.ssh root@192.168.1.100 "ls /home/root"    当前服务器A远程登录服务器B后执行某个命令
5.ssh root@192.168.1.100 -t "sh /home/root/ftl.sh"     当前服务器A远程登录服务器B后执行某个脚本

1.5 export

export命令用于设置或显示环境变量。

export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。

语法:
export [-fnp] [变量名称]=[变量设置值]

参数说明:
-f 代表[变量名称]为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p  列出所有的shell赋予程序的环境变量。

export MYENV    //定义环境变量
export MYENV=7  //定义环境变量并赋值
export LD_LIBRARY_PATH = `pwb`  // 程序运行依赖库的位置,通过此命令可以将 当前目录 追加到用户库文件路径。
export SIG_ADDR = 192.168.10.100  //定义当前信令地址

参考链接:Linux export命令

1.7 其他命令

查看历史使用命令:history
过滤与es相关命令:history | grep es

查看当前目录:pwd

查看机器间是否网络连通:ping 192.168.xx.xx
ping6 2408:80e3:c000:8::11

查看IP信息:ifconfig 或 ifconfig | more或ip addr

查看当前系统端口:

命令:netstat -an  查看全部端口
命令:netstat -an | grep 8080 搜索指定端口

结束进程:kill
命令:kill pid 或者 kill -9 pid(强制杀死进程)
pid:进程号

重启网络
命令:service network restart

清屏
命令:ctrl + l

查看linux版本:cat /etc/redhat-release

查看LINUX是多少位:getconf LONG_BIT

关闭防火墙

service iptables stop      临时关闭防火墙
chkconfig iptables off     防火墙开启不启动
 service iptables status    查看防火墙状态

开机启动选项

msconfig                    查看开机启动选项
chkconfig                    查看开机启动服务列表

2 目录操作命令

2.1 目录切换 cd (change directory)

命令:cd 目录

cd /      切换到根目录
cd /usr        切换到根目录下的usr目录
cd ../        切换到上一级目录 或者  cd ..
cd ~       切换到home目录
cd -        切换到上次访问的目录

2.2 目录查看 ls (list)

命令:ls [-al]

ls                查看当前目录下的所有目录和文件
ls -a            查看当前目录下的所有目录和文件(包括隐藏的文件)
ls -l    列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls  /dir            查看指定目录下的所有目录和文件   如:ls /usr

2.3 创建目录 mkdir (make)

命令:mkdir 目录

mkdir    aaa            在当前目录下创建一个名为aaa的目录
mkdir    /usr/aaa    在指定目录下创建一个名为aaa的目录

2.4 删除目录或文件 rm(remove)

命令:rm [-rf] 目录

删除文件:
rm 文件        删除当前目录下的文件
rm -f 文件    删除当前目录的的文件(不询问)
删除目录:
rm -r aaa    递归删除当前目录下的aaa目录
rm -rf aaa    递归删除当前目录下的aaa目录(不询问)
全部删除:
rm -rf *    将当前目录下的所有目录和文件全部删除
rm -rf /*    【自杀命令!慎用!慎用!慎用!】将根目录下的所有文件全部删除

注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了方便大家的记忆,无论删除任何目录或文件,都直接使用 rm -rf 目录/文件/压缩包

2.5 目录修改 mv和cp (move、copy)

一、重命名目录
命令:mv 当前目录 新目录
例如:mv aaa bbb 将目录aaa改为bbb
注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行重命名的操作

二、剪切目录
命令:mv 目录名称 目录的新位置
示例:将/usr/tmp目录下的aaa目录剪切到 /usr目录下面 mv /usr/tmp/aaa /usr
注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作

三、拷贝目录
命令:cp -r 目录名称 目录拷贝的目标位置 -r代表递归
示例:将/usr/tmp目录下的aaa目录复制到 /usr目录下面 cp /usr/tmp/aaa /usr

1. 将/data/a目录下的aaa目录复制到/user目录下
 cp -r  /data/a/aaa  /user
2. 将/data/a目录下的aaa.txt目录复制到/user目录下
 cp  -r /data/a/aaa.txt  /user
3. 将/data/a目录下的aaa.txt目录备份到/data/a目录下面bbb.txt
 cp -r /data/a/aaa.txt  /data/a/bbb.txt
 	
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不用写-r递归

2.6 搜索目录【查】find

命令:find 目录 参数 文件名称
示例:
which ls 查找可执行的命令
find /usr/tmp -name ‘a*’ 查找/usr/tmp目录下的所有以a开头的目录或文件
find -name ‘a*’ 查找当前目录下所有以a开头的目录或文件
find / -name “zwh*” -ls 从某个文件夹开始查找

3 文件操作命令

3.1 新建文件touch

命令:touch 文件名
示例:在当前目录创建一个名为aa.txt的文件 touch aa.txt

3.2 删除文件 rm

命令:rm -rf 文件名

3.3 修改文件 vi或vim

【vi编辑器的3种模式】
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

  1. 命令行模式command mode)
    控制屏幕光标的移动,字符、字或行的删除,查找,移动复制某区段及进入Insert mode下,或者到 last line mode。
    命令行模式下的常用命令:
    【1】控制光标移动:↑,↓,j
    【2】删除当前行:dd
    【3】查找:/字符
    【4】进入编辑模式:i o a
    【5】进入底行模式::

  2. 编辑模式(Insert mode)
    只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
    编辑模式下常用命令:
    【1】ESC 退出编辑模式到命令行模式;
    【2】编辑文件,使用vi编辑器打开文件后点击按键:i ,a或者o即可进入编辑模式。

  3. 底行模式(last line mode)
    将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
    底行模式下常用命令:
    【1】退出编辑: :q
    【2】强制退出: :q!
    【3】保存并退出: :wq

打开文件
命令:vi 文件名
示例:打开当前目录下的aa.txt文件 vi aa.txt 或者 vim aa.txt

注意:使用vi编辑器打开文件后,并不能编辑,因为此时处于命令模式,点击键盘i/a/o进入编辑模式。

编辑文件
使用vi编辑器打开文件后点击按键:i ,a或者o即可进入编辑模式。
i:在光标所在字符前开始插入
a:在光标所在字符后开始插入
o:在光标所在行的下面另起一新行插入

保存或者取消编辑

保存文件:
第一步:ESC 进入命令行模式
第二步:: 进入底行模式
第三步:wq 保存并退出编辑
wq! 强制保存并退出

取消编辑:
第一步:ESC 进入命令行模式
第二步:: 进入底行模式
第三步:q! 撤销本次修改并退出编辑
q 如果内容修改会提示是否保存

vi模式下快捷键
esc后:

保存并退出快捷键:shift+z+z
光标跳到最后一行快捷键:shift+g
删除一行:dd
复制一行内容:y+y
粘贴复制的内容:p

3.4 文件的查看【查】

文件的查看命令:cat/more/less/tail

cat:看最后一屏

示例:使用cat查看/etc/sudo.conf文件,只能显示最后一屏内容
cat sudo.conf
cat /data/aaa.txt

more:百分比显示

示例:使用more查看/etc/sudo.conf文件,可以显示百分比,回车可以向下一行,空格可以向下一页,q可以退出查看
more sudo.conf

less:翻页查看

示例:使用less查看/etc/sudo.conf文件,可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
less sudo.conf

tail:指定行数或者动态查看(实时查看日志)

示例:Ctrl+C结束
tail -10 sudo.conf 使用tail -10 查看/etc/sudo.conf文件的后10行
tail -f /data/aa.log 查看aa.log的后10行内容
tail -n 7 /data/aa.log 查看aa.log的后7行内容
head /data/aa.log 查看aa.log的前10行内容
head -n 7 /data/aa.log 查看aa.log的前7行内容

3.5 权限修改chmod(change mode)

rwx:r代表可读,w代表可写,x代表该文件是一个可执行文件,如果rwx任意位置变为-则代表不可读或不可写或不可执行文件。

示例:给aaa.txt文件权限改为不可执行文件权限,aaa.txt文件的权限是-rw-------

第一位:-就代表是文件,d代表是文件夹
第一段(3位):代表拥有者的权限
第二段(3位):代表拥有者所在的组,组员的权限
第三段(最后3位):代表的是其他用户的权限

421  421  421
-  rw-   ---     ---
代表拥有者可读可写,不可执行,组员和其他用户没有任何权限

在这里插入图片描述

chmod -rw-r--r--  test.txt
前三位代表当前用户对文件权限:可以读/可以写/不能执行
中间三位代表当前组的其他用户对当前文件的操作权限:可以读/不能写/不能执行
后三位其他用户对当前文件权限:可以读/不能写/不能执行

修改文件权限
命令:chmod 777 /home/dd 把目录的权限修改为777。

chmod  [who]   [+|-|=]   [mode]  文件名
who可以是: u、g、o、a(all)。
操作符号可以是:
   +  添加某个权限
   -  取消某个权限
   =  赋予某个权限并取消其他所有权限
mode可以是所有权限的组合:
	r 可读
	w 可写
	x 可执行
	t 保存程序的文本到交换设备上
	u 和文件属主拥有一样的权限
	o 和其他用户拥有一样的权限

3.6 终止当前操作

ctrl+c和ctrl+z都是中断命令,作用不一样。
ctrl+z是将任务中断,在进程中维持挂起的状态,可使用fg/bg操作前台和后台的任务,bg把被中断的任务放到后台执行,fg重新启动被中断的任务。

4. 压缩文件操作

4.1 打包和压缩

Windows的压缩文件的扩展名 .zip/.rar
linux中的打包文件:aa.tar
linux中的压缩文件:bb.gz
linux中打包并压缩的文件:.tar.gz

Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。

命令:tar -zcvf 打包压缩后的文件名 要打包的文件
其中:
-z:调用gzip压缩命令进行压缩
-c:建立新的压缩文件
-v:显示操作过程
-f:指定压缩文件名

示例:打包并压缩/usr/tmp 下的所有文件 压缩后的压缩包指定名称为xxx.tar
tar -zcvf ab.tar aa.txt bb.txt 或:tar -zcvf ab.tar *

另一种压缩(zip/unzip)

  1. zip a.zip 1.txt 将1.txt压缩到a.zip
  2. zip -r a.zip a/ 将目录进行压缩
  3. zip -r a.zip 1.txt 2.txt 将多个文件压缩为zip文件

4.2 解压

命令:tar [-zxvf] 压缩文件
其中:
-x:代表解压
-z:支持gzip解压文件
-f:指定压缩文件
示例:将/usr/tmp 下的ab.tar解压到当前目录下
tar -zxvf ab.tar
示例:将/usr/tmp 下的ab.tar解压到根目录/usr下
tar -xvf ab.tar -C /usr------C代表指定解压的位置
tar -zxvf ab.tar -C /user/

unzip a.zip 解压
unzip -d /data/a.zip 将a.zip解压到指定/data/app/目录下

4.3 常见包的解压与压缩

.tar文件
解包:tar zvxf FileName.tar
打包:tar cvzf FileName.tar DirName
(注:tar是打包,不是压缩)

.gz文件
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName

.tar.gz 和 .tgz文件
解压:tar zvxf FileName.tar.gz
压缩:tar cvzf FileName.tar.gz DirName

.bz2文件
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩:bzip2 -z FileName

.tar.bz2文件
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 Dirname

.zip文件
解压:unzip FileName.zip
压缩:zip FileName.zip DirName

.rar文件
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

4.4 scp命令

(1) 从远处复制文件到本地目录

scp 文件名 @root/ip:路径

scp wutbio002@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

【说明:从192.168.120.204机器上的/opt/soft/的目录中下载nginx-0.5.38.tar.gz 文件到本地/opt/soft/ 目录中】

(2)上传本地文件到远程机器指定目录

scp 文件名 root@ip:/路径

scp /opt/soft/nginx-0.5.38.tar.gz wutbio002@192.168.120.204:/opt/soft/scptest

【说明:复制本地opt/soft/目录下的文件nginx-0.5.38.tar.gz 到远程机器192.168.120.204的opt/soft/scptest 目录中】

参考链接:Linux中的tar命令和scp命令

5 查找命令

5.1 grep

grep命令是一种强大的文本搜索工具

使用实例:

grep abc test.txt 在test.txt中搜索abc字符串,大小写敏感且显示行号
grep -n abc test.txt		             在test.txt文件中搜索abc字符串,大小写敏感且显示行及行号;
grep -v abc test.txt		             在test.txt文件中搜索abc字符串,大小写敏感且显示没搜索到的行;
grep -i abc test.txt		             在test.txt文件中搜索abc字符串,大小写敏感且显示行;
grep -ni abc test.txt		             在test.txt文件中搜索abc字符串,大小写敏感且显示行及行号;
ps -ef | grep sshd  查找指定ssh服务进程 
ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp本身 
ps -ef | grep sshd -c 查找指定进程个数 

5.2 find

find命令在目录结构中搜索文件,并对搜索结果执行指定的操作。

find 默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

find . -name "*.log" -ls  在当前目录查找以.log结尾的文件,并显示详细信息。 
find /root/ -perm 600   查找/root/目录下权限为600的文件 
find . -type f -name "*.log"  查找当目录,以.log结尾的普通文件 
find . -type d | sort   查找当前所有目录并排序 
find . -size +100M  查找当前目录大于100M的文件

5.3 locate

locate 让使用者可以很快速的搜寻某个路径。默认每天自动更新一次,所以使用locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。如果数据库中没有查询的数据,则会报出locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory该错误!updatedb即可!

yum -y install mlocate 如果是精简版CentOS系统需要安装locate命令

updatedb
locate /etc/sh 搜索etc目录下所有以sh开头的文件 
locate pwd 查找和pwd相关的所有文件

5.4 whereis

whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。

使用实例:

whereis ls    将和ls文件相关的文件都查找出来

5.5 which

which命令的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。

使用实例:

which pwd  查找pwd命令所在路径 
which java  查找path中java的路径

6 su(switch user)、sudo(super user do)

Ubuntu刚安装后,不能在terminal运行su命令,因为root没有默认密码,需要手动设定。

6.1 给root用户设置密码

sudo passwd root
回车会让输入密码
在这里插入图片描述
这样密码就设置好了。

6.2 su和sudo的区别

  • su的密码是root的密码,而sudo是用户的密码
  • su直接将身份变成root,而sudo是以用户登录之后以root的身份运行命令,不需要知道root密码。

6.3 su 切换登录用户

su用于用户之间的切换。但是切换前的用户依然保持登录状态。如果是root 向普通或虚拟用户切换不需要密码,反之普通用户切换到其它任何用户都需要密码验证。

su test:切换到test用户,但是路径还是/root目录
su - test : 切换到test用户,路径变成了/home/test
su : 切换到root用户,但是路径还是原来的路径
su - : 切换到root用户,并且路径是/root
exit: 退出返回之前的用户

su不足:如果某个用户需要使用root权限、则必须要把root密码告诉此用户。

退出返回之前的用户:exit

6.4 sudo 权限赋予

sudo是为所有想使用root权限的普通用户设计的。可以让普通用户具有临时使用root权限的权利。只需输入自己账户的密码即可。

进入sudo配置文件命令:
vi /etc/sudoer或者visudo

案例:
允许hadoop用户以root身份执行各种应用命令,需要输入hadoop用户的密码。
hadoop  ALL=(ALL)   ALL 
 
案例:
只允许hadoop用户以root身份执行ls 、cat命令,并且执行时候免输入密码。 
配置文件中: 
hadoop  ALL=NOPASSWD:  /bin/ls, /bin/cat 

6.5 用户及权限操作命令

创建用户
useradd 或adduser
useradd [参数] 用户名

修改密码:
passwd 参数 用户名

删除用户
userdel 参数 用户名

参考链接:Linux常用操作命令大全

7 代码运行

7.1 查看是否安装gcc

gcc -v
在这里插入图片描述
如果显示gcc没有找到,则是没有gcc。

7.2 安装gcc

sudo apt install gcc
或apt-get install gcc
出现了这种错误
在这里插入图片描述
将网络连接模式修改为桥连模式,然后 sudo apt-get update,然后又出现这种错误
在这里插入图片描述
查看网络连接,如果网络显示小问号,把网络关闭再重新开启。

命令行
重启网络命令:service networking restart
重启网卡命令:ifconfig eth0 up

然后执行 sudo apt install gcc
在这里插入图片描述
折腾了好久,哭了-_-

7.3 gcc基础操作

GCC编译分为四步:1. 预处理,2.预编译,3.编译,4.链接

  1. 预处理:gcc -E可对原文件进行预处理并输出.i文件。
    gcc -E hello.c -o hello.i
    在这里插入图片描述

  2. 预编译:gcc -S 对源文件进行汇编输出.s文件,,可通过ls查看
    gcc -S hello.i
    在这里插入图片描述

  3. 编译:输入gcc -c就可对源文件进行汇编并输出.o文件
    gcc -c hello.s -o hello.o
    在这里插入图片描述

  4. gcc hello.o -o hello 对原文件进行链接并生成可执行文件,ls查看生成了绿色的可执行文件
    在这里插入图片描述

上面四个步骤可通过一个命令直接执行。
gcc hello.c -o hello

最后执行文件
./ hello
在这里插入图片描述
在这里插入图片描述

7.4 make命令

make在linux中是一个非常重要的编译命令,利用make可以将大型的开发项目分解为多个更容易管理的模块。

有如下工程文件:
在这里插入图片描述
下面是makefile的内容:
在这里插入图片描述
为了编译整个工程,可以使用make或在make后面带上目标 all
在这里插入图片描述
再次查看目录内容,多了一些o文件和执行文件:
在这里插入图片描述
假设对test.c做了一些修改,重新make编译:
在这里插入图片描述
可以看到只有test.o重新编译了,现在清理所有目标文件和可执行文件,可使用 make clean,会将所有.o文件和执行文件删除。

参考:gcc安装与编译
Linux中的make命令怎么用

8 gdb调试

8.1 简介

程序员在编译程序时发现的问题是语法或链接问题,能编译通过只能说明我们的程序在语法和链接时未产生错误,但不能说明我们程序就是完全正确的,因为程序的业务逻辑问题是在执行时才会发现的。而调试的目的就在于发现程序中的业务逻辑问题,一般使用IDE的可以直接使用自带的调试工具进行程序运行调试,那如果我们是在没有IDE的linux环境下又该如何对程序进行调试呢?最简单的方式就是调用打印函数(C语言中就是printf函数)进行程序语句运行的跟踪,找出问题所在,这种方式的缺点就是需要不停添加printf修改源码,重新编译运行,最后还得删除这些调试信息;gdb就是一个功能强大的调试工具。

调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。

当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。

在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。

设置断点(breakpoint)
break +offset / break -offset :在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum :在源文件filename的linenum行处停住。
break filename:function :在源文件filename的function函数的入口处停住。
break *address :在程序运行的内存地址处停住。

查看断点时,可使用info命令,如下所示:(注:n表示断点号)

info breakpoints [n]
info break [n]
设置观察点(watchpoint)

观察点一般来观察某个表达式(变量也是一种表达式)或内存的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:

watch 变量名或内存的地址
watch i  // 整型变量
watch p 或 watch *p   //前者是查看*(&p),是p变量本身,后者是p指向内存的内容。
rwatch
awatch
info watchpoints :列出当前所设置了的所有观察点。
设置捕捉点(catchpoint)
维护停止点

上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。

clear : 清除所有的已定义的停止点。
delete [breakpoints] [range…] : 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。
disable [breakpoints] [range…] :disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.disalbe不会删除,就像回收站一样。
enable [breakpoints] [range…] :enable所指定的停止点,breakpoints为停止点号。
enable [breakpoints] once [range…] :enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。
enable [breakpoints] delete [range…] :enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。
停止条件维护
信号
线程

结构体

线程

8.3 gdb调试代码

  1. 启动gdb
    使用vim编辑器编写一个简单的代码并保存

    vim hello.c
    

    然后使用gcc将其编译为可执行文件,调试使用-g表示该程序可调试,代表添加DEBUG信息。

    gcc -g hello.c -o hello
    

接下来输入 gdb -q + 可执行文件,启动gdb调试。

	gdb hello
	或
	gdb -q hello

-q可以屏蔽一些gdb版本相关的信息,页面看起来干净些。
在这里插入图片描述

  1. 启动源码
    输入 list (简写为l) 即可查看程序源码:

    list:显示源码,默认显示10行
    list 行号:显示当前文件以行号为中心的前后10行代码
    list 函数名:显示函数名所在函数的代码
    list:接着上次list命令,输出下边的内容
    

在这里插入图片描述

进入TUI模式也可以查看源码。

	gdb --tui ./hello    --tui告诉gdb启动终端界面模式。
	或gdb hello之后,执行tui enable,或组合键ctrl+x+a
	退出tui,组合键ctrl+x+a  或者命令行 tui disable
  1. 运行程序
    run (r) 直到遇到“断点”或者“结束”。
    start 开始执行程序,程序会从main函数开始,停在第一个断点的位置。
    在这里插入图片描述

  2. 设置断点
    输入break (b) + 数字就可对程序进行断点操作,数字是设置断点的代码行数。

b pkt.c:22 在pkt.c文件的22行打断点
b func 在函数func入口打断点
在这里插入图片描述
输入info breakpoint(info b) 即可查看断点信息。

Num: 断点编号
Disp:断点执行一次之后是否有效(keep:有效 dis:无效)
Enb: 当前断点是否有效 (y:有效 n:无效)
Address:内存地址
What:位置

在这里插入图片描述
运行一下 r
在这里插入图片描述

  1. 单步执行

    next (n):单步执行程序,但是遇到函数时会直接跳过函数,不进入函数
         n num:向后执行num步
    step (s):单步执行程序,但遇到函数会进入函数
    continue (c):继续执行程序,直到遇到断点或结束
    
  2. 查看变量

    print  变量:查看变量值
    print ++i:将i中的值加1显示
    print gdb(22):将22作为参数调用gdb()函数
    whatis 变量:查看变量数据类型
    ptype var  显示var类型结构体的成员
    what 表达式:设置一个监视点,一旦监视点的值改变,gdb将强行终止正在被调试的程序。
    display 变量:每次程序暂停会自动显示变量的值,如果跟多个变量名,需要类型相同。
    info display:可查看已经设置的自动显示的变量信息。
    undisplay 编号:取消自动变量的显示。
    bt 显示当前函数的调用过程
    

在这里插入图片描述
打印变量显示格式

p temp;默认十进制打印
p /x temp;按十六进制打印
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

参考链接:gdb attach使用

  1. 修改变量的值

print 变量名=值 可以给变量赋值,查看变量值不同时的结果

p x=2   //给变量x赋值2
p test->x = 30  //给结构体的成员赋值
p node.ID=100 // 给类对象赋值
  1. 退出
    输入q即可退出gdb

  2. 断点设置
    在这里插入图片描述

  3. 运行命令
    在这里插入图片描述

  4. 运行信息
    在这里插入图片描述
    info function:查询函数
    where/bt:当前运行的堆栈列表
    bt (backtrace): 显示当前调用堆栈
    up/down 改变堆栈显示的深度
    set args 参数:指定运行时的参数
    show args:查看设置好的参数
    info program: 来查看程序的是否在运行,进程号,被暂停的原因。
    info proc 显示当前程序可执行文件相关信息
    info frame 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句
    ​ info args 打印出当前函数的参数名及其值。
    ​ info locals 打印出当前函数中所有局部变量及其值。
    info function: 查询函数
    ​ info catch 打印出当前的函数中的异常处理信息
    查看当前main局部变量的值,可以使用frame(f)命令查看main的栈帧,然后选择一号栈帧,查看局部变量。
    修改某个变量的初值:set var sum=0

  5. 使用gdb内嵌函数
    在使用p命令时,可以直接使用gdb内嵌的一些函数,也可以使用常用表达式。

p sizeof(int)  //4
p 12==12 // true
  1. 查看结构体、类的值

在这里插入图片描述
结构体成员较多,一个一个查看不方便,p *new_node可以显示整个结构体的信息。
在这里插入图片描述
不显示空字符:
set print null-stop
show print null-stop
再次执行时不显示空字符

但结构体成员显示杂乱无章,可以
set print pretty
show print pretty
在这里插入图片描述

  1. 查看数组的值

在这里插入图片描述
同样数组显示也不美观。可以使用set print array on,查看更方便。

查看数组长度:p *array@len @左边是第一个内存的地址的值,@右边是想查看内存的长度。

  1. 查看内存

使用x命令查看各个变量的内存信息
x /选项 地址

x /x 以十六进制输出
x /d 以十进制输出
x /c 以单字符输出
x /i 反汇编 – 通常,我们会使用 x/10i ip−20来查看当前的汇编(ip是指令寄存器)
x /s 以字符串输出
在这里插入图片描述
定义了字符串类型、int变量和结构体,在test_memory()处设置断点,断点命中后,查看变量的内存信息

字符串类型:
x str默认十六进制 或 x /s str 会直接显示字符串的内容。

int型:
int型不是指针,所以首先要找到它的地址。使用p &number 查看地址,再使用地址查看内存,也可以直接使用x &number查看内存
在这里插入图片描述
查看结构体在内存中是如何存储的,x /16s node
在这里插入图片描述
node在内存中的存储顺序与结构体中声明成员的顺序一致。

  1. call 调试函数

gdb设置参数

set args 可指定运行时的参数
show args 查看设置好的运行参数

  1. 分割窗口

layout :分割窗口,一边看代码,一边调试。
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口

参考链接:
查看结构体、类的值
gdb 笔记(07)— 自动显示变量值、显示源代码、监视变量或内存、查看内存

8.4 多线程调试

查看线程:
shell命令:
(1)查看当前正在运行的进程:ps aux | grep [要查询的进程]
(2)查看进程id:ps

gdb命令:
(1) 调试正在运行的程序 :gdb attach pid
(2)查看可切换调试的线程:info threads,每next两步都可以查看一下,可能会新增或减少线程;
(3)切换调试的线程:thread 线程id,可通过info threads 查看,*标记的为当前所在的线程。
(4)只运行当前线程: set scheduler-locking on
在切换到要调试的线程后可运行此命令只执行当前线程。
(5)运行全部线程:set sheduler-locking off
不只运行单个线程时可执行此命令,执行所有线程。
(6) 指定某线程执行某gdb命令:thread apply 线程id gdb_cmd
thread apply 2 n 让子线程2执行gdb命令next
(7) 全部线程执行某gdb命令:thread apply all gdb_cmd

参考链接:GDB多线程调试(调试命令+调试演示)

8.5 多进程调试

gdb命令:
(1) 调试父进程:set follow-fork-mode parent(缺省值,默认)
(2)调试子进程:set follow-fork-mode child
(3)设置调试模式:set detach-on-fork [on|off] (缺省值on)
on:调试当前进程的时候,其他进程继续运行
off:调试当前进程的时候,其他进程被gdb挂起
(4) 查看可调试的进程: info inferiors
(5)切换调试的进程:inferior 进程id

通过命令查看main进程(pid),ps -aux | grep main,启动gdb attach pid 即可调试正在运行的程序,也可以执行gdb main pid,与gdb attach pid相同。

参考链接:GDB多进程调试(调试命令+调试演示)

8.6 常用命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.7 实例

参考连接:GDB调试操作
Linux下gdb调试工具的使用
Linux下gdb调试
Linux下的GDB调试工具

9. apt指令

9.1 简介

apt是Advanced Package Tool的简写,是linux软件管理包。

apt整合了apt-get和apt-cache——这两个命令功能很多但一般往往用不到,因此apt保留了常用和重要的功能。

一些apt命令需要对/etc/apt, /etc/cache, /var/cache/apt, /var/lib/apt进行读写操作,这些命令需要sudo权限。

而对于下载包、显示包信息、检索包等,则无需sudo权限。

9.2 需要sudo权限的命令

更新软件包索引 sudo apt update
升级所有可更新的包 sudo apt upgrade
升级单个程序包  sudo apt upgrade package_name
安装软件包 sudo apt install package_name
可以安装多个包 sudo apt install package1 package2
可以安装已经下载好的deb包 sudo apt install /path_to_deb/file.deb/
移除软件包sudo apt remove package_name
使用remove会保留配置文件,使用purge可以完全移除软件包:sudo apt purge package_name

9.3 无需sudo权限的命令

下载软件包  apt download package_name
显示可用软件包 sudo apt list
查看某个包是否可用:使用grep命令  sudo apt list | grep package_name
查看已安装包 apt list --installed
搜索包 apt search package_name
查看包信息apt show package_name

10. apt-get指令

apt-get是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。常用格式为apt-get [选项] 命令
在这里插入图片描述

运用apt-get进行本地数据库更新,使用命令:sudo apt-get update
查看依赖关系,依赖关系即A软件依赖于B软件,使用命令:sudo apt-get check
软件安装,使用指令:sudo apt-get install software-name
软件更新,使用指令:sudo apt-get upgrade ipmitool
软件卸载,使用指令:sudo apt-get remove ipmitool

参考链接:Linux apt下载指令

11. 通信中使用

灌包命令ipef

下行灌包: 目标地址 + 本地地址
iperf -u –c 192.168.116.5 –t 300 -i 1 –b 300m –B 10.10.2.12

上行灌包: 目标地址 + 本地地址
iperf -u –c 192.169.0.67 –t 300 -i 1 –b 15m –B 192.168.116.5

接收:
iperf -s -u -i 1

192.168.116.5 ----- UE_IP地址
10.10.2.12 -------DN地址

-c 表示客户端
-s 表示服务器
-u udp通信
-I 每次发包时间间隔
-t 每次测试一共多少s
-b 传输包的速率,单位bps
-B 表示绑定的IP或端口。
-p 端口号

抓包

tcpdump –i 网口 –w BBU_LOG.pcap
查看该网口的抓包,抓包log会放在当前目录的BBU_LOG.pcap文件中。

添加路由

route -n 查看路由
route add –net ip地址 netmask 掩码 dev 网口 如果没有路由,需要添加路由

查看接口处流量

sar –n DEV 1 2 | grep enp61s0f1 每隔1秒,写入两次
在这里插入图片描述
在这里插入图片描述

-n 查看流量
-r 查看内存利用率
-p CPU利用率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值