1.Linux基础命令
1.1开关机
sync :把内存中的数据写到磁盘中(关机、重启前都需先执行sync)
shutdown -r now或reboot :立刻重启
shutdown -h now :立刻关机
shutdown -h 20:00 :预定时间关闭系统(晚上8点关机,如果现在超过8点,则明晚8点)
shutdown -h +10 :预定时间关闭系统(10分钟后关机)
shutdown -c :取消按预定时间关闭系统
1.2系统信息
who am i :查看当前使用的终端
who 或 w : 查看所有终端
uname -m :显示机器的处理器架构(如x86_64)
cat /proc/version :查看linux版本信息
uname -r :显示正在使用的内核版本
rpm -qa | grep kernel-devel :查看kernel-devel版本(安装软件时编译内核用,故需要保持内核版本一致性)
yum install -y “kernel-devel-uname-r == $(uname -r)”:安装和Linux内核版本匹配的kernel-devel
date :显示系统日期 (date +%Y/%m/%d : 显示效果如2018/01/01)
date 070314592018.00 :设置时间(格式为月日时分年.秒 )
cal 2018 :显示2018年的日历表
clear :清空命令行
ifconfig :显示或设置网卡(查ip等)(类似windows中ipconfig)
ping -c 3 www.baidu.com :测试百度与本机的连接情况( -c 3表示测试3次)
cat /proc/cpuinfo :显示CPU的信息
1.3系统性能
top :动态实时显示cpu、内存、进程等使用情况(类似windows下的任务管理器)
top -d 2 -p 7427 :-d为画面更新的秒数,默认5秒,-p为指定进程pid的信息
vmstat 2 10 :每隔2秒采集一次服务器状态,采集10次(查看内存、io读写状态、cpu)
free -h :查看系统内存及虚拟内存使用情况
df -h :显示磁盘的空间使用情况
iostat :可查io读写、cpu使用情况
sar -u 3 5 :查看cpu使用情况(3秒一次,共5次)
sar -d 2 3 :评估磁盘性能
kill -9 进程号 :强制杀死进程
systemctl :查看正在运行的服务
1.4文件和目录
cd:是Change Directory的缩写,用来切换工作目录,
语法:cd [相对或绝对路径或特殊符号]
cd :进入该用户的主目录 ~(root用户为/root,其他用户为/home/用户名)
cd … :返回上一级目录(注意要空格)
cd - :返回上次所在目录
cd / :返回根目录 (绝对路径)
cd ./目录1/目录2 :进入当前目录下的子目录(相对路径)
pwd :显示工作路径(Print Working Directory 的缩写)
ls:是List的缩写,用于列出目录下的文件,
语法:ls [选项][目录或文件名]
ls -a :列出文件下所有的文件,包括以“.“开头的隐藏文件
file 文件或目录 :显示文件的类型(目录、text、zip、shell脚本等)
mkdir dir1 :创建目录(dir1)(mkdir为make directory的缩写)
mkdir -p ./dir1/dir2 :递归创建目录(-p:父目录不存在时,同时建立)
touch a.txt :创建文件a.txt
rm:可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉; 语法:rm (选项)(参数)(注:如果参数中含有目录,则必须加上-r选项);
rm 文件 :删除文件
rm -r 目录或文件 :删除目录(及目录下所有文件)(非空也可以)
rm -rf 目录或文件 :强制删除,如:rm -rf * 为删除当前目录下所有文件
mv:是move的缩写,可以用来剪切移动文件、目录或者将文件改名;
语法:mv 源文件 目标文件(改名)或目录(移动);
mv a b :移动或者重命名一个文件或者目录(存在即移动目录或覆盖文件,不存在即改名)
mv /opt/git/g /opt/a :移动g到opt目录下并改名为a(a目录不存在,若存在则为移动g到a目录下)
mv -t ./test a.txt b.txt :移动多个文件到某目录下
cp:复制文件或目录;cp命令可以将单个或多个文件复制到一个已经存在的目录下;
常用:cp -ai 文件或目录 目标目录;
cp -ai /opt/abc /opt/git/ :复制abc目录(或文件)到git目录下(选项a表示文件的属性也复制、目录下所有文件都复制;i表示覆盖前询问)
ln:link的缩写,用于建立硬(软)链接,常用于软件安装时建软链接(类似快捷方式)到PATH;
语法:ln [-s] 源文件 目标文件
ln -s /opt/a.txt /opt/git/ :对文件创建软链接(快捷方式不改名还是a.txt)
ln -s /opt/a.txt /opt/git/b :(快捷方式改名为b)(下面的一样可以改名)
ln -s /opt/mulu /opt/git/ :对目录创建软链接
ln /opt/a.txt /opt/git/ :对文件创建硬链接
1.5文件权限
chmod [-R] 777文件或目录 :设置权限(chmod a+rwx a=chmod ugo +rwx a=chmod 777 a)
注: r(read)对应4,w(write)对应2,x(execute)执行对应1;
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改)
chmod [{ugoa}{±=}{rwx}][文件或目录] :如chmod u-w,g+x,o=r test.txt为user(拥有者)去掉写权限,group(所属组)加上执行权限,other(其他人)权限等于只读;
chown [-R] admin:root /opt/ :变更文件及目录的拥有者和所属组(-R递归处理所有文件和文件夹,admin为拥有者,root为所属者)
1.6文件查找
locate a.txt :在系统全局范围内查找文件名包含a.txt字样的文件(比find快);
locate:原理是updatedb会把文件系统中的信息存放到数据库databases中(但一般一天才执行一次,所以locate找不到新创建的文件,需要先手动执行updatedb,再执行locate),locate从数据库中读数据;
find:在目录结构中搜索文件,并执行指定的操作
语法:find pathname -options [-print -exec …]
pathname :为 find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录(find查找范围为目标目录及其子目录所有文件及目录);
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和;之间的空格;
-print: find命令将匹配的文件输出到标准输出;
find /home -mtime -2 :在/home下查最近224小时内改动过的文件
find . -size +100M :在当前目录及子目录下查找大于100M的文件
find . -type f :f表示文件类型为普通文件(b/d/c/p/l/f 分别为块设备、目录、字符设备、管道、符号链接、普通文件)
find . -mtime +2 -exec rm {} ; :查出更改时间在224小时以前的文件并删除它**
find . -name ‘.log’ -exec grep -i hello {} ; -print :在当前目录及子目录下查出文件名后缀为.log的文件并且该文件内容包含了hello字样并打印,-exec 命令 {} \表示对查出文件操作,-i表示不区分大小写;
find . -name '.log’|grep hello :在当前目录及子目录下查出文件名后缀为.log的文件并且文件名包含了hello字样(grep用来处理字符串);
grep -i ‘HELLO’ . -r -n :在当前目录及子目录下查找文件内容中包含hello的文件并显示文件路径(-i表示忽略大小写)
which java :在环境变量$PATH设置的目录里查找符合条件的文件,并显示路径(查询运行文件所在路径)
whereis java :查看安装的软件的所有的文件路径(whereis 只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令)
1.7查看文件的内容
cat [-n] 文件名 :显示文件内容,连行号一起显示
less 文件名 :一页一页的显示文件内容(搜索翻页同man命令)
head [-n] 文件名 :显示文件头n行内容,n指定显示多少行
tail [-nf] 文件名:显示文件尾几行内容,n指定显示多少行,f用于实时追踪文件的所有更新,常用于查阅正在改变的日志文件(如tail -f -n 3 a.log 表示开始显示最后3行,并在文件更新时实时追加显示,没有-n默认10行)
sed -n ‘2,$p’ ab :显示第二行到最后一行;
sed -n ‘/搜索的关键词/p’ a.txt :显示包括关键词所在行
cat filename |grep abc -A10 :查看filename中含有abc所在行后10行(A10)、前10行(B10)内容
less a.txt|grep git :显示关键词所在行,管道符”|”它只能处理由前面一个指令传出的正确输出信息,对错误信息信息没有直接处理能力。然后传递给下一个命令,作为标准的输入;
cat /etc/passwd |awk -F ‘:’ ‘{print $1}’ :显示第一列
1.8文本处理
ls -l>file :输出重定向>(改变原来系统命令的默认执行方式):ls -l命令结果输出到file文件中,若存在,则覆盖
cat file1 >>file :输出重定向之cat命令结果输出追加到file文件
ls fileno 2>file : 2>表示重定向标准错误输出(文件不存在,报错信息保存至file文件);
cowsay <a.txt :重定向标准输入’命令<文件’表示将文件做为命令的输入(为从文件读数据作为输入)
sed -i '4, d ′ a . t x t :删除第四行到最后一行( d' a.txt :删除第四行到最后一行( d′a.txt:删除第四行到最后一行(表示最后一行)(sed可以增删改查文件内容)
sed -i ‘$a 增加的字符串’ a.txt :在最后一行的下一行增加字符串
sed -i ‘s/old/new/g’ a.txt :替换字符串;格式为sed ‘s/要替换的字符串/新的字符串/g’ 修改的文件
vim 文件:编辑查看文件(同vi)
1.9用户与权限
useradd 用户名 :创建用户
userdel -r 用户名 :删除用户:(-r表示把用户的主目录一起删除)
usermod -g 组名 用户名 :修改用户的组
passwd [ludf] 用户名 :用户改自己密码,不需要输入用户名,选项-d:指定空口令,-l:禁用某用户,-u解禁某用户,-f:强迫用户下次登录时修改口令
groupadd 组名 :创建用户组
groupdel 用户组 :删除组
groupmod -n 新组名 旧组名 :修改用户组名字
su - 用户名:完整的切换到一个用户环境(相当于登录)(建议用这个)(退出用户:exit)
su 用户名 :切换到用户的身份(环境变量等没变,导致很多命令要加上绝对路径才能执行)
sudo 命令 :以root的身份执行命令(输入用户自己的密码,而su为输入要切换用户的密码,普通用户需设置/etc/sudoers才可用sudo)
1.10磁盘管理
df -h :显示磁盘的空间使用情况 及挂载点
df -h /var/log :(显示log所在分区(挂载点)、目录所在磁盘及可用的磁盘容量)
du -sm /var/log/* | sort -rn : 根据占用磁盘空间大小排序(MB)某目录下文件和目录大小
fdisk -l :查所有分区及总容量,加/dev/sda为查硬盘a的分区)
fdisk /dev/sdb :对硬盘sdb进行分区
mount /dev/sda1 /mnt :硬盘sda1挂载到/mnt目录(mount 装置文件名 挂载点)
mount -t cifs -o username=luolanguo,password=win用户账号密码,vers=3.0 //10.2.1.178/G /mnt/usb :远程linux 共享挂载windows的U盘,G为U盘共享名,需设置U盘共享
mount -o loop /opt/soft/CentOS-7-x86_64-DVD-1708.iso /media/CentOS :挂载iso文件
umount /dev/sda1 :取消挂载(umount 装置文件名或挂载点)
1.11压缩、解压和打包备份
单纯tar仅为打包(多个文件包成一个大文件),加上参数-j(bzip2格式.bz2)、-z(gzip格式.gz)可以备份、压缩(-c)、解压(-x),备份一般比压缩多加参数-p(保留原本文件的权限与属性),-C可以指定解压到特定目录;bzip2、gzip只能对单一文件压缩;
file 文件名 :查文件类型(可看是用哪一种方式压缩的)
tar -zxvf a.tar.gz -C ./test :解压tar.gz到当前目录下的test目录
tar -zcvf /opt/c.tar.gz ./a/ :压缩tar.gz(把当前目录下的a目录及目录下所有文件压缩为 /opt/目录下的c.tar.gz)
tar -jxvf a.tar.bz2 :解压tar.bz2(到当前目录)
tar -jcvf c.tar.bz2 ./a/ :压缩tar.bz2(把当前目录下的a目录及目录下所有文件压缩到当前目录下为c.tar.gz2)
unzip a.zip :解压zip(到当前目录)
zip -r c.zip ./a/ :压缩zip(把当前目录下的a目录及目录下所有文件压缩到当前目录下为c.zip
bzip2 -k file1 : 压缩一个 ‘file1’ 的文件(-k表示保留源文件)(bzip2格式,比gzip好)
bzip2 -d -k file1.bz2 : 解压一个叫做 'file1.bz2’的文件
gzip file1 : 压缩一个叫做 'file1’的文件(gzip格式)(不能保留源文件)
gzip -9 file1 : 最大程度压缩
gzip -d file1.gz : 解压缩一个叫做 'file1’的文件
2.gdb调试
2.1Gdb的功能:
l 设置断点
l 监视程序变量的值
l 程序的单步执行
l 显示、修改变量的值
l 显示、修改寄存器
l 查看程序的堆栈情况
l 远程调试
2.2Gdb调试过程:
1、程序经过预处理后,即进入编译阶段,进入编译阶段,首先声明编译:
2、格式:gdb -o test test.c -g
3、进入编译:gdb test
4、显示需要编译调试的源程序:l(list)//list filename
5、设置断点:b(break)行号
6、查看设置的断点:info b
7、运行调试程序:run
8、跳到下一个断点:c(continue)
9、单步运行的话使用:n(next)/s(step into)跳到函数体 //区别在与:next执行函数体,而step不执行函数体
10、调试过程中查看某个变量的变化:print i (每次都要手动设置)//display i(设置一次一直尾随,直到用“undisplay 变量标号” 停止)
11、退出当前的调试使用finish 跳出函数
12、清楚断点 clear 行号
13、Delete 断点信息序号// 删除所有断点或设置的要删除的断点
14、退出调试 q
15、b num if i50 改变断点的触发条件
2.3 strace工具
什么是strace?
strace是一个非常简单的工具,它可以跟踪系统调用的执行。最简单的方式,它可以从头到尾跟踪binary的执行,然后以一行文本输出系统调用的名字,参数和返回值。
其实它可以做的更多:
可以对特定的系统调用或者几组系统调用进行过滤
可以通过统计特定系统调用的调用次数、耗费的时间、成功和失败的次数来配置(profile)系统调用的使用I
跟踪发送给进程的信号量
可以通过pid附着(attach)到任何运行的进程
如果你使用的是其它Unix系统,它类似于"truss"。其它更复杂的是Sun的Dtrace.
2.4 valgrind软件开发工具
Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。
3.函数库
4.静态库
静态库 之所以叫做静态库, 是因为在编译阶段,它已经把我们函数库的代码已经被载入可执行文件中了
优点就是编译后的执行程序不需要外部的函数库支持。
缺点就是生成的文件比较的大,若是函数库的代码改变了,则需要重新编译。
静态的一般命名为 名字 + 后缀名 ,一般的形式如下:libxxx.a
4.1 静态库的制作一般步骤如下
编辑代码 max.h max.c
1.将 c 源文件编译成目标文件 gcc -c max.c -o max.o
2.将目标文件打包静态库 ar crs libmax.a max.o
3.查看生成的 .a 文件由目标文件生成的 ar -t libmax.a
ar 是用于创建库的命令,相应的选项如下:
c — creat 创建
r — repace 以替换的方式在库中插入模块
s — symbol 将目标文件的索引符号表添加到库中
4.编辑 main.c 调用静态库中的 max 函数
gcc main.c -L. -I. -lmax -o max
在 gcc 选项中 -L 指定库的路径, -I 指定头文件的路径
gcc 编译的文件.c -L 库的路径 -l库的名字 -I 头文件所在路径
Linux 系统中链接器默认查找的库文件路径为/lib 和/usr/lib
Linux 系统中头文件默认查找的路径为/usr/include
5.动态库
动态库在链接时由链接器链接,可执行程序运行时由加载器载入内存
默认搜索路径 : /lib 和/usr/lib
动态库的制作流程 :
1.先获取与位置无关的代码的目标文件
gcc -fPIC -c max.c -o max.o
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码,则产生的代码中,没有绝对地
址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的
执行,共享库要求,被加载时,在内存的位置不是固定的
2.生成动态库 gcc -shared max.o -o libmax.so
3.编译 main.c 链接动态库
gcc main.c -L. -I. -lmax -o max
./max 执行后报错:
查看动态库的信息
使用 ldd 命令,可以查看可执行文件需要链接的库
在编译时虽然链接了库,但是程序运行的时候,加载器无法找到动态库,有两种方式解决:
加载器默认到/lib 和/usr/lib 下搜索库。我们可以生成的库文件移动到/usr/lib 目录下,然后再用-l 库名来连接即可
gcc main.c -o main -lmax
我的路径:/home/ubuntu/study/linux/day2/program
加载器也会默认 LD_LIBRARY_PATH 环境变量中的路径,把自己的路径添加到环境变量 LD_LIBRARY_PATH
将动态库路径添加到 LD_LIBRARY_PATH 中
LD_LIBRARY_PATH= <*.so文件的路径>
导出环境变量
export LD_LIBRARY_PATH
查看环境变量 LD_LIBRARY_PATH 的值
echo $LD_LIBRARY_PATH
编译并链接动态库
gcc main.c -L. -I. -o max -lmax
6.静态库与动态库的比较
静态库与动态库
.一般程序都是制作成二进制的库,提供头文件
.Linux :
*.a : 静态库
*.so : 动态库
/lib ,/usr/lib
.静态库与动态库都是将目标文件(*.o)打包
.静态库在链接时会直接整合到可执行文件中
.动态库在链接时不会整合到可执行文件中,在运行时才加载到内存中
.在编译使用动态库时需要指定库的路径与头文件的路径
gcc xxxx -I<头文件路径> -L<库的路径> -lxxx -o xxxx
.动态库加载器在加载时是从 /lib 或者 /usr/lib 找到动态库加载到内存中
.可以将动态库拷贝到 /lib 或者 /usr/lib