Peripateticism

Yuens' blog

View the Project on GitHub

Ubuntu常用命令(不断补充中)

个人常用命令集锦,比方查看硬件信息或者文件操作,查找定位等等,由于积累的多了,太长了,所以这里列出目录方便查找。[toc]

性能&监控

硬件信息

CPU

总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

系统信息

内存

用户权限

#查看当前用户所属组
groups
#查看指定用户abc所属组
groups abc
#添加用户abc到docker组
sudo usermod -a -G sudo abc

参考:Docker Got permission denied  http://www.myexception.cn/operating-system/2173364.html

删除sudo分组中的abc用户:sudo vim /etc/group,找到对应sudo分组,删掉用户名abc

程序代码安装

一、基本概念

1.1、什么是库

在 windows 平台和 linux 平台下都大量存在着库。本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行。由于 windows 和 linux 的平台不同(主要是编译器、汇编器和连接器 的不同),因此二者库的二进制是不兼容的。这里仅介绍 linux下的库。

1.2、 库的种类

linux 下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同:

动态通常用.so为后缀, 例如:libhello.so。共享库(动态库)的好处是:不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。

ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

1.3 静、动态库在linux下的生成

以下面的代码为例,生成上面用到的hello库:

/* hello.c */ 
#include "hello.h" 
void sayhello() 
{ 
    printf("hello,world "); 
}

首先用gcc编绎该文件,在编绎时可以使用任何合法的编绎参数,例如-g加入调试代码等:

gcc -c hello.c -o hello.o

1、生成静态库 生成静态库使用ar工具,其实ar是archive的意思:

ar cqs libhello.a hello.o

2、生成动态库 用gcc来完成,由于可能存在多个版本,因此通常指定版本号:

gcc -shared -o libhello.so.1.0 hello.o

1.4、库文件的命名规范

在 linux 下,库文件一般放在/usr/lib和/lib下:

1.5、可执行程序在执行的时候如何定位共享库(动态库)文件 :

当系统加载可执行代码(即库文件)的时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径,此时就需要系统动态载入器 (dynamic linker/loader) 

对于 elf 格式的可执行程序,是由 ld-linux.so* 来完成的,它先后搜索 elf 文件的 DT_RPATH 段–>环境变量LD_LIBRARY_PATH—->/etc/ld.so.cache 文件列表–> /lib/,/usr/lib 目录找到库文件后将其载入内存。如: export LD_LIBRARY_PATH=’pwd’ ,即将当前文件目录添加为共享目录。

1.6、使用ldd工具,查看可执行程序依赖那些动态库或着动态库依赖于那些动态库:

ldd 命令可以查看一个可执行程序依赖的共享库, 例如

ldd /bin/lnlibc.so.6 
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2 
=> /lib/ld- linux.so.2 (0×40000000)

可以看到 ln 命令依赖于 libc 库和 ld-linux 库

1.7、使用nm工具,查看静态库和动态库中有那些函数名;

(T类表示函数是当前库中定义的,U类表示函数是被调用的,在其它库中定义的,W类是当前库中定义,被其它库中的函数覆盖):

有时候可能需要查看一个库中到底有哪些函数,nm工具可以打印出库中的涉及到的所有符号,这里的库既可以是静态的也可以是动态的。nm列出的符号有很多, 常见的有三种::

例如,假设开发者希望知道上文提到的hello库中是否引用了 printf():

nm libhello.so | grep printf
#或者
nm -D libhello.so

发现printf是U类符号,说明printf被引用,但是并没有在库中定义。由此可以推断,要正常使用hello库,必须有其它库支持,使用ldd工具查看hello依赖于哪些库:

ldd libhello.so
libc.so.6=>/lib/libc.so.6(0x400la000)
/lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000)

文件基本操作

文件大小

文件执行权限

要让文件有能够执行的权限:chmod +x ./abc.sh

文件计数

md5对比

MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。

在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。

ps:感觉这个-c参数用的时候有点问题

挂载硬盘

建立软连接

ln的链接分为软链接和硬链接两种。

如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls –l命令去察看,就可以看到显示的link的路径了。

Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。

范例: 例1:将档案 yy 产生一个 symbolic link : zz ln -s yy zz 文件夹建立软链接(用绝对地址) ln -s 源文件地址(当前文件地址) 目的地址(待建立链接的地址) 比如我把Linux文件系统rootfs_dir软链接到/home/jyg/目录下 ln -s /opt/linux/rootfs_dir /home/jyg/rootfs_dir就可以了 例2:将档案 yy 产生一个 hard link : zz ln yy xx 更多参数使用见参考。 ubuntu文件夹建立软链接方法 - - 博客频道 - CSDN.NET http://blog.csdn.net/jiuyueguang/article/details/9350859

文件拷贝rsync(这个命令有点诡异==,能用scp就用scp,进度通过du -sh来查看)

文件拷贝cp

第一种:实现同名文件重命名的拷贝 给出shell脚本(但实际这段脚本还是有点问题,实现的是第三种):

#!/bin/bash
from_path="/home/enyu/222/"
to_path="/home/enyu/111/"
file=`ls ${from_path}`
for filename in $file
do
    if [ -e "${target_path}${filename}" ];then
        cp ${from_path}${filename} ${to_path}${filename}_old
    else
        cp ${from_path}${filename} ${to_path}${filename}
    fi
done

Qt5安装

sudo apt install -y qt-default qtcreator qtdeclarative5-dev

软件压缩与解压

7z格式

tar.gz

.bz2

据说这种压缩率很高:

.tar后缀

解压:tar -xvf xxxxx.tar

rar

gz解压

查找与定位

任务管理进程

软件安装下载卸载

Linux端点续传后台下载命令wget

命令wget -c -b http://abc.com/file.zip,断点续传下载(-c参数表示继续下载,-b代表后台下载,产生下载日志wget-log文件)。

参考

彻底卸载某软件softname1

找到此软件名称,然后sudo apt-get purge softname1,purge参数为彻底删除文件,然后sudo apt-get autoremove,sudo apt-get clean和dpkg -l |grep ^rc|awk ‘{print $2}’ | sudo xargs dpkg -P 两条命令来清除残余的配置文件。再来一次sudo apt-get remove –purge softname1,然后用sudo apt-get update来更新一新软件信息。

参考

服务器运维

有两个命令用来上传、下载文件(适合中小文件的上传和下载)

如果输入rz和sz提示没有这两个命令,就是没安装:sudo apt install lrzsz

网络问题

环境变量

Linux的变量种类按变量的生存周期来划分,Linux变量可分为两类:

  1. 永久的:需要修改配置文件,变量永久生效。
  2. 临时的:使用export命令声明即可,变量在关闭shell时失效。

设置变量有三种方法:

2.1 在/etc/profile文件中添加变量【对所有用户生效(永久的)

2.2 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)

用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。例如:编辑guok用户目录(/home/guok)下的.bash_profile(现在叫做~/.bashrc)

添加如下内容:

注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。

2.3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)

在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

3.环境变量的查看

3.1 使用echo命令查看单个环境变量。(使用LD_LIBRARY_PATH=""可以清空该变量值)例如:

3.2 使用env查看所有环境变量。例如:

3.3 使用set查看所有本地定义的环境变量。

4.常用的环境变量

别名的设置与变量设置方法相同,在不同文件中设置可以使其永久生效或者临时生效,如:可以在/etc/profile文件中添加 alias ls=’ls –color=auto’   alise ll=’ls -alF’ 设置命令ll 和ls

shell算术运算

加减乘除:

直接执行上面会给出一个数字外加command not found,那个数字就是运算的结果,如果不想看到这个数字可以在前面加上echo命令,如echo $[10+10],就不会有命令找不到的报错了。

bc为任意精度算数语言提供解释器,即binary calculator,往往用于实现高精度的计算。

echo "3.14*999." | bc

# 把1000转为2进制
echo 'obase=2;1000' | bc

# 把1000转为8进制
eccho 'obase=8;1000' | bc

当然直接在命令行输入bc进入交互模式也可以用。