linux&shell操作大全

摘要:
1.编写shell脚本-基本语法:1.条件判断:数字比较:-eq等于-Ne不等于-Gt大于-Lt小于-Ge大于或等于-Le小于或等于;字符串比较不等于“$A”!A[@]}“;do echo”${A[$i]}“done3$?返回最后一条指令的结果:functionadd(){Return `expr$1+$2`}add2350#返回73if[$?”Fi注:结果输出为yyy0;因为18行返回16行结果;4.获取键盘输入:read-p“你还好吗?(y/n)”to_Continueif[-z$to_contine]#结果为空,则exit-1else if[$to_concontinue!

一 shell脚本的编写&基础语法:
1 条件判断:
数字比较:
-eq 等于;-ne 不等于;-gt 大于;-lt 小于;-ge 大于等于;-le 小于等于;
字符串比较
不相等 "$A" !="$B" 相等"$A" =="$B"

2 循环:
 while true循环:
  while :
  do
    内容
  done
 
 while循环
  while [ $i -le 100 ]
  do
    let i+=2
  done
 for循环,可以遍历指定数组;
  a=(1 2 3 4 6 7 8 9 10 11 12 13)
  for i in "${!a[@]}";
  do
    echo "${a[$i]}"
  done

3 $?返回上一条指令结果:
function add(){
return `expr $1 + $2`
}
add 23 50 #此处返回73
if [ $? -eq 73 ]
then
echo "yyy $?"
else
echo "nnn $?"
fi
注:结果输出为yyy 0;因为18行返回的是16行的结果;

4 获得键盘输入:
read -p "are you ok?(y/n)" to_continue
if [ -z $to_continue ] #结果为空
then
   exit -1
else
  if [ $to_continue != 'y' ] #结果不等于y
  then
    echo "exit"
     exit -1
  fi
fi

5 获取文件中每一行数据,并输出
cat 文件名 | while read line
do
echo $line
done

6 带颜色的字体输出
字体颜色
#30:黑 ;#31:红 ;#32:绿 ;#33:黄 ;#34:蓝色 ;#35:紫色 ;#36:深绿 ;#37:白色
背景颜色
#40:黑 ;#41:深红 ;#42:绿 ;#43:黄色 ;#44:蓝色 ;#45:紫色 ;#46:深绿 ;#47:白色
echo -e "e[47;35m你好e[0m"白底紫字

7 输出结果到屏幕(控制台)同时写入文件
假设run.sh有输出,则
sh run.sh | sed "w log"
结果写入log;

输入一条命令的同时,利用tee命令将结果输出到文件,例如ifconfig | tee ifconfig.log

8 shell中引号的区别:单引号,双引号,反引号(一般是键盘ESC下边那个)
上代码:
name=tim
echo '1 $name has $800'
echo "2 $name has $800"
echo '3 $name has $800'
echo "4 $name has $800"
echo '5 ls ./'
echo "6 ls ./"
echo `ls ./`
输出:
1 $name has $800
2 tim has 00
3 $name has $800
4 tim has $800
5 ls ./
6 ls ./
文件列表
说明:
1 单引号将所有内容当做字符,一视同仁,忽略所有的命令和特殊字符;双引号可以包含特殊字符并解析,并且需要输出特殊字符,需要加;反引号内部是一个命令,会先执行命令,然后返回结果;
2 输出说明:
1是单引号,所以直接输出结果;2是双引号,所以对$name进行解析;3是单引号,同1;4想输出$字符,加转义字符;5,6直接输出;7 执行ls操作,返回文件列表;

9 字符串操作
  字符串拼接:
    str1=“”
    str1=$str1"xxxx "

二 .sh脚本成熟的代码段,操作命令集锦
1 喜闻乐见的小指令:
a 一句话指令
du -sh/du -sh *
du -sh * | sort -h -r 按照大小排序;
df -h
gdb --args
find . -name "*.cpp"|xargs cat|wc -l 统计代码行数;
find ./file/ -size +2M 查找file文件夹下文件尺寸大于2M的文件;

b 软链
建立软链 ln -s 实际存在文件 目标文件;
删除软链 rm ./软链文件名
对软链文件的操作,等同于对原文件的操作;

c 查看机器信息
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l,查看有多少个CPU;
cat /proc/cpuinfo| grep "cpu cores"| uniq 每个CPU对应的核数;
一般机器是两个CPU,里面多核;
查看centos系统版本:cat /etc/redhat-release;

d 计算文本中某一列的均值,grep -r 某些关键字符串 文件 | awk '{sum += $8}END{print sum/NR}'

  awk缺省的切分是空格,如果需要按照:来切分,则需要修改脚本为:grep 某字符串 ./log文件 | awk -F ':' '{print $17}' | awk '{sum+=$1}END{print sum/NR}' 注意:-F设置分割符号

e 查看端口是否被占用
  ss -lntpd 展示所有端口;
  ss -lntpd | grep :22 寻找端口号22被什么程序占用;

g ls
ls 显示当前文件夹下所有文件
ll/ls -l ,(a) + 显示一些细节信息,名称排序
ls -lt (b) + 按照时间排序/ls -t,仅按照时间排序;
ls -R 若目录下有文件,则以下之文件亦皆依序列出;
ls -r 将文件以相反次序显示(原定依英文字母次序)
ls -S/ls -Sr,按照文尺寸,从大到小/从小到大排序;

ls -Sl / ls -Slr or ll -S / ll -Sr 按照文尺寸,从大到小/从小到大排序,显示详细信息;
ls -h 表示”–human-readable”,单位是k或者M ,比较容易看清楚结果


2 sort 对ip排序:
命令说明:
”-t” : 表示以那个字符做分割
“-k” :和-t结合使用,表示取那一段为关键字进行排序,后面跟数据,1…n,表示取第几段,也可以是范围如1,3,表示将第1段到第3段作为一个整体来排序
“-n” :以数字进行排序
“-r” :倒序
# 按升序排序
sort -t'.' -k1,1n -k2,2n -k3,3n -k4,4n ip.txt
# 按降序排序
sort -t'.' -k1,1nr -k2,2nr -k3,3nr -k4,4nr ip.txt

3 查看机器/程序信息
lscpu 查看cpu 信息;
查看centos系统版本:cat /etc/redhat-release
rpm -e gcc-4.4.6-4.tl1.x86_64删除已有gcc版本;
rpm -q gcc 检查是否安装;
yum info gcc 查看自带的gcc版本
rpm -Uvh *.rpm 安装rpm;

ps(Process Status)
PID,进程分配的id;PPID,该id的父id;
ps -ef,显示所有进程信息,连同命令行
ps -aux 列出目前所有的正在内存当中的程序,比ps -ef多了内存,cpu等信息;
显示某个进程占用内存,命令:
ps -ef | grep "xx name" |grep -v grep |grep -v gdb| awk '{print $2}' | xargs -I {} cat /proc/{}/status |grep -e VmRSS |awk '{printf $2/1048576;print "GB"}'
grep -v 排除掉含有某些内容的行;
程序信息存储在/proc/{}/status 中,VmRss是内存信息;
xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:
示例:ls *.js | xargs -t -I '{}' mv {} {}.backup
mv a.js a.js.backup
mv b.js b.js.backup

三 linux基础定义
1 ~/.bashrc
  这个可以认为是linux系统的启动项,每次启动的时候都会运行一些这里边的命令;
  常见的有:
    alias rm='rm -i'//修改某些指令;
    export LD_LIBRARY_PATH=……//制定环境变量;LD_LIBRARY_PATH是linux系统的环境变量,直接去其目录下去找lib库等;

2 gcc
  gcc(gnu collect compiler)是一组编译工具的总称;它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等;

3 glibc
  glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下:
(1)string,字符串处理
(2)signal,信号处理
(3)dlfcn,管理共享库的动态加载
(4)direct,文件目录操作
(5)elf,共享库的动态加载器,也即interpreter
(6)iconv,不同字符集的编码转换
(7)inet,socket接口的实现
(8)intl,国际化,也即gettext的实现
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虚拟终端设备的管理,及系统的安全访问
(13)malloc,动态内存的分配与管理
(14)nis
(15)stdlib,其它基本功能

4 binutils
  binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的;

5 linux下边的文件夹及其作用;
data
etc
mnt 一般是空的,用于挂载其他文件系统;
opt
usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32。
/usr/local:用户级的程序目录,用户自己安装的软件会装在这里;
opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。
lib -> usr/lib,存放系统库;
lib64 -> usr/lib64;
bin -> usr/bin;
sbin -> usr/sbin;

四 linux基础操作
1 git相关
git配置:
cat ~/.ssh/id_rsa.pub #检查是否已经有SSH key pair
ssh-keygen -t rsa -C "name" #生成SSH key pair
cat ~/.ssh/id_rsa.pub #获取SSH key pair,将其copy到git网页版本的ssh keys的页面上即可;
配置完成,直接clone代码即可;
git常用命令:
git clone https://github.com/kaldi-asr/kaldi // 从网上复制代码;
git branch //查看本地分支信息;
git branch -a //查看所有分支,包括非本地的分支
git checkout -b 本地分支名 origin/远程分支名;eg:git checkout -b new_v origin/new_v //从远程将分支拉取至本地;
git push 代码仓库名 远程分支名:本地分支名;eg:git push origin new_a:new_a//本地提交代码;
一般可以直接git push完成操作,默认推到当前分支;
git checkout . //代码还原;
git checkout + 分支名;//代码切换至分支;
git reset --hard +提交编号;//将代码回退到某次提交
查看用户信息:
git config user.name
git config user.email
修改用户名和邮箱地址:
git config --global user.name "xxxx"
git config --global user.email "xxxx"

2 crontab
  作用:相当于时钟,可以定时完成某个操作;
  命令:
    crontab -u root -e r l 
      -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI;也可以直接打开/etc/crontab编辑;
      -r : 删除目前的时程表,注:是全部删除,慎用;
      -l : 列出目前的时程表
  内部格式:
    * * * * * 操作
    - - - - -
    | | | | |
    | | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
    | | | +---------- 月份 (1 - 12)
    | | +--------------- 一个月中的第几天 (1 - 31)
    | +-------------------- 小时 (0 - 23)
    +------------------------- 分钟 (0 - 59)
    举例:
      0 */2 * * * oper 意思是每两个小时oper一下
      */2 * * * * oper 每两分钟oper一下
      50 7 * * * oper 每天7:50oper
      50 22 * * * oper 每天22:50
      0 0 1,15 * * oper 每月1号和15号
      1 * * * * oper 每小时的第一分
      00 03 * * 1-5 oper 每周一至周五3点钟,
      30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
  注:一般root账户,可以设置user,如果是非root账户,无需在crontab -e中设置账户,默认就是当前账户;crontab失效原因一般是:路径和权限错误,特别是sh文件,里边需 加上bin/bash等信息;
  crond 是linux执行周期性任务的守护进程,命令如下:
    service crond start //启动服务
    service crond stop //关闭服务  
    service crond restart //重启服务
    service crond reload //重新载入配置
    service crond status //查看crontab服务状态:
  注:crond一般是打开的,这时候执意要你crontab -e,就会自动的更新,无需重启等操作;

3 时间相关操作
3.1 获取当前时间
  $(date +"%Y-%m-%d %H:%M:%S")
计算某个程序的耗时;代码如下:
  startTime_s=`date +%s`
  operateXXX
  endTime_s=`date +%s`
  sumTime=$[ $endTime_s - $startTime_s ]
  echo "time cost : $sumTime s"
  如何将耗时以s统计的,换成以分钟,小时统计的呢?
    可以直接使用[],如下,不过这种方式都是int数除法,比如4/3 = 1;
      echo "cost : $sumTime s = $[sumTime/60] m = $[sumTime/3600] h"
    如果需要小数,可以使用bc工具,用scale控制保留几位小数;
      time_m=`echo "scale=2; $sumTime/60 " | bc`
      time_h=`echo "scale=2; $sumTime/3600 " | bc`
      echo "time cost : $sumTime s = $time_m m = $time_h h ----"
    也可不使用time_m,直接加到命令中,如下;
      echo "time cost : $sumTime s = `echo "scale=2; $sumTime/60 " | bc` m = `echo "scale=2; $sumTime/3600 " | bc` h"
3.2 指令修改系统时间
  date 查看目前系统时间;
  更新时间如下:
    date -s 20201103
    date -s 18:32:23

4 vim
4.1 文件编码改变
vim 内部修改
set fileencoding 查看当前文件编码;
set fenc=gbk 将文件设置成gbk模式;
外部修改
file 指令,查看文件类型;
iconv -f UTF-8 -t GBK text_1 -o text_2
iconv -f GBK -t UTF-8 text_gbk -o text_1

4.2 vim设置,在~/.vimrc文件中,之间copy弄好的~/.vimrc,~/vim即可;
syntax enable#语法高亮
highlight LineNr cterm=bold ctermfg=red#行号,前景色红色
highlight LineNr cterm=bold ctermbg=white#行号,背景色白色
set t_Co=256#鼠标批量选中部分颜色灰色
set cursorline#光标线
set colorcolumn=120#有条竖线

4.3 查看当前文档缩进是空格,还是tab : set list,^I是tab;将当前文件tab->空格: :%s/ / /g

5 scp
5.1 远程拷贝,命令:2 scp -r 源位置 目标位置,跨服务器拷贝;
5.2 不需要二次输入密码,使用nohup,并且不在控制台显示信息;
a nohup sshpass -p "密码" scp -r 要拷贝的文件 目标路径 > scp_log 2>&1 &
b nohup sshpass -p "密码" scp -r 要拷贝的文件 目标路径 &
说明:
  sshapass -p 设定密码scp,无需每次输入密码;
  a比b的优势是a直接将结果输入到scp_log中,b默认输出到nohup文件,并在控制台显示;
  nohup 操作 & 意思执行操作,忽略所有挂断信号;
5.3 scp失效,一般是机器存储了错误的公匙,找到本机/root/.ssh/known_hosts,删除错误ip即可,下次会显示
  Are you sure you want to continue connecting (yes/no)? yes
  Warning: Permanently added '[ip]:36000' (ECDSA) to the list of known hosts.
  root@ip's password:
    完成一次成功的scp之后,你会发现你删掉的那行有出现了在/root/.ssh/known_hosts文件中;
  注:从A机器传文件到B机器,known_hosts在A机器中;另,不同用户在同一台机器上,使用不同的known_hosts;

6 环境变量
6.1 linux 路径前缀
有时候前缀太长了,耽误我们做事情,可以修改一下;
查看当前前缀:
echo $PS1
临时修改:
export PS1='u@100.100.1.1:w#'----u 用户名;w 完整路径;W 当前路径名,即,用户名@ip:路径;这样做的好处是要copy到别的环境,直接复制即可;
export PS1='W#' ----常用,直接设置成当前文件名,清爽;
永久修改:
vim ~/.bashrc
将上述操作写入文件即可;这个可以认为是初始化操作;
6.2 添加库到环境变量
echo $LD_LIBRARY_PATH //查看环境变量
export LD_LIBRARY_PATH=/data1/kaldi/tools/openfst/lib/:$LD_LIBRARY_PATH //加入到环境变量
  永久添加:
vim ~/.bashrc
export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64/:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
其中~/.bashrc类似于系统的启动项,每次启动前运行他;所以可以把很多需要开始时候定义的东西加进去;

7 linux账户管理
  Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统;用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护;
  7.1 用户账号的管理:
    a 增 : useradd 选项 用户名
      参数说明:
        选项:
          -c comment 指定一段注释性描述;
          -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录;
          -g 用户组 指定用户所属的用户组;
          -G 用户组,用户组 指定用户所属的附加组;
          -s Shell文件 指定用户的登录Shell;
          -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号;
          -p 设置密码,必须是秘文,不建议使用;
        用户名 : 指定新账号的登录名;
      举例:
        实例1 # useradd –d /home/sam -m sam
          此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录);
        实例2 # useradd -s /bin/sh -g group –G adm,root gem
          此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组;
          这里可能新建组:#groupadd group及groupadd adm
          增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等;
          Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理;
    b 删:userdel 选项 用户名
      常用的选项是 -r,它的作用是把用户的主目录一起删除;

    c 改:usermod 选项 用户名
      常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值;
       另外,有些系统可以使用选项:-l 新用户名 ;这个选项指定一个新的账号,即将原来的用户名改为新的用户名;
    d 查
      
  7.2 用户密码管理
    修改密码:passwd 选项 用户名
      /etc/security/opasswd文件存储历史密码,如果有冲突可以修改或删除对应的历史密码;
      /etc/login.defs 文件存储了一些密码要求,如果有对密码的要求不满足(比如必须带数字等),可以修改对应文件;

  7.3 用户组的管理
    每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建;
    用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新;
    7.3.1 用户组操作
      增 : groupadd 选项 用户组
      删 :groupdel 用户组
      改:groupmod 选项 用户组
          -g GID 为用户组指定新的组标识号;
        -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同;
        -n新用户组 将用户组的名字改为新名字;
      查:
    7.3.2 用户组切换,适用于一个用户,有多个用户组使用命令newgrp (另一个用户组) 切换;

  7.4 系统文件管理
    与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等;
    7.4.1 /etc/passwd
      每一行记录一个用户属性,举例如下,部分内容省略:
      # cat /etc/passwd
        root:x:0:0:Superuser:/:
        daemon:x:1:1:System daemons:/etc:
        usera:x:1000:1000::/home/usera:/bin/bash      
      含义是:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
      口令是加密的,所以只能看到x;
      用户标识号,一般从100开始,0标识超级用户root,0~100系统备用;
      组标示号对应着/etc/group文件中的一条记录;

    7.4.2 /etc/shadow
      /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生;
      直接pwconv运行即可;
      它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开。这些字段是:
        登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

    7.4.3 /etc/group
      用户组的所有信息都存放在/etc/group文件中;
      将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段;
      每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组;
      当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组;
      用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员;
      用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:
        组名:口令:组标识号:组内用户列表

    7.4.4 /etc/sudoers,他就是来存储操作超级账户的,默认只有root,可以把你想设置成超级用户的加进去;
      
  7.5 给用户改变权限
    vim /etc/passwd文件
      root:x:0:0:root:/root:/bin/bash
      peter:x:0:0::/home/peter:/bin/bash#将x后边的改成都改成0即可,权限和root就一致了,注:此操作不可取,乃是黑客常用手段;
  7.6 密码要求,某些系统会对密码有要求,例如,密码必须有多少个数字,多少个小写字母之类的规则;
  在/etc/pam.d/system-auth中设置;
   该行内容如下:
    password requisite pam_pwquality.so minlen=9 try_first_pass local_users_only retry=3 authtok_type= enforce_for_root ocredit=0 lcredit=-1 ucredit= 0 dcredit=0 [badwords=first2012++]
    说明:
     minlen=8 最小密码长度为8位
    ucredit=-2 最少有2个大写字母
   lcredit=-4 最少4个小写字符
   dcredit=-1 最少1个数字
   ocredit=-1 最少1个符号
   remember=5 密码最近5次的不能重用
   按需要进行设计即可;

  7.7 vim /etc/login.defs,内存有登录信息,密码有效期等信息;
  7.8 示例:
    增加一个用户名和密码都是worker的组,并且设置工作目录为/data/worker/ ;然后删除它;
      groupadd worker
      useradd -g worker -d /data1/worker -s /bin/bash/ -m worker
      passwd worker #设置密码
      userdel worker
      groupdel worker
      rm -rf /var/spool/mail/worker

  7.9 说明:
    7.9.1 最好不要直接修改etc下边的文件夹;

8 程序分析
  8.1 linux 运行时间优化和分析(注:会在程序执行目录下生成对应的文件,同时需要再执行目录下运行下述命令)
    0 删除之前的文件内容
  find -name "*.gc*" |xargs rm -rf
  find -name "*.o" |xargs rm -rf
 1 编译:g++ -o run -g -pg -fprofile-arcs -ftest-coverage ./main.cpp;注意,在常规编译环节加上-g -pg -fprofile-arcs -ftest-coverage即可;
    2 运行可执行文件run;
 3 执行runlcov.sh脚本,得到output文件,即函数cover文件,显示文件某一行是否被执行,被执行多少次的文件;
  runlcov.sh:
    lcov --capture --directory ./ --output-file test.info --test-name test
    genhtml test.info --output-directory output --title "dyna analysis" --show-details --legend

    或者genhtml test.info -o output/

    lcov可能没有安装,https://sourceforge.net/projects/ltp/files/Coverage%20Analysis/LCOV-1.13/下载,运行make install进行安装;

     4 得到调用关系和热点函数占比
  gprof -b bin(可执行文件) >log

  gprof2dot.py log | dot -Tpdf -o fib-gprof.pdf
  输出关系在fib-gprof.pdf文件中;

  注:gprof2dot.py的git是https://github.com/jrfonseca/gprof2dot;dot需要安装yum install graphviz;生成调用关系图,如下:

linux&shell操作大全第1张

8.2 内存优化
使用valgrind进行内存优化;
编译程序:g++ -o run -g3 ./main.cpp
valgrind 跑程序:valgrind -v --log-file=valgrind.log --tool=memcheck --leak-check=full --show-mismatched-frees=yes ./run
valgrind 跑程序:valgrind -v --log-file=valgrind.log --tool=memcheck --leak-check=full --show-mismatched-frees=yes --undef-value-errors=no ./run,不显示未初始化的数值

看日志:vim ./valgrind.log
71 ==29995== HEAP SUMMARY:
72 ==29995== in use at exit: 10,000 bytes in 1 blocks
73 ==29995== total heap usage: 1 allocs, 0 frees, 10,000 bytes allocated
74 ==29995==
75 ==29995== Searching for pointers to 1 not-freed blocks
76 ==29995== Checked 204,728 bytes
77 ==29995==
78 ==29995== 10,000 bytes in 1 blocks are definitely lost in loss record 1 of 1
79 ==29995== at 0x4C29BFD: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
80 ==29995== by 0x400651: main (main.cpp:5)//具体泄漏的代码行数
81 ==29995==
82 ==29995== LEAK SUMMARY:
83 ==29995== definitely lost: 10,000 bytes in 1 blocks
84 ==29995== indirectly lost: 0 bytes in 0 blocks
85 ==29995== possibly lost: 0 bytes in 0 blocks
86 ==29995== still reachable: 0 bytes in 0 blocks
87 ==29995== suppressed: 0 bytes in 0 blocks

9 文件和权限:

  9.1 ll/ls -l的结果是什么?

linux&shell操作大全第2张

  linux每一个用户都属于一个组,不能独立于组外。linux的文件权限需要定义三个实体对它的权限:文件所有者;文件所在组;其他组;

  所有者:

    一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者

    可以使用chown【change owner】 用户名 文件名来修改文件的所有者,例如更改error.log的所有者为zhangsan;

      chown zhangsan error.log  #更改所有者为zhangsan;

      chown .home error.log  #更改用户组为home

  所在组:

    当用户创建了一个文件后,这个文件的所在组就是该用户所在的用户组;

    可以使用chgrp【change group】来改变文件的所在组;

      chgrp home error.log #修改文件的所在组为home

  9.2 修改权限

    修改权限的命令是chmod,而改变权限的方式分为两种

      1.数字改变权限法

        Linux的文件基本权限只有九个,分别是onwer,group,other三种身份,所以我们可以用数字来代表权限,其中 r : 4 w : 2 x : 1

        每种身份设置权限为数字的累加,比如将error.log文件设置成所有人都有RWX权限,则 chmod 777 error.log

         因为[-rwxrwxrwx]实际上是[4+2+1][4+2+1][4+2+1]也就是777了。如果我们将权限变为[-rwxr-xr--]则[4+2+1][4+0+1][4+0+0]即为754

      2  符号改变法实际上就是对不同实体设置权限,其中我们只要懂的三个部分的含义就可以

chmodu+(加入)文件或目录
g=(设置)
o
a-(除去)

        举几个例子来说明吧,设置用户对error.log有rwx权限,所在组和其他组有rx权限: chmod u=rwx,go=rx error.log

        设置用户对error.log有rwx权限,所在组有rx权限,其他组有r权限 chomd u=rwx,g==rx,o=r errlog.log

        所有用户的可执行权限 chmod a-x error.log

五 linux软件安装&使用

1 安装python
从python官网上现在最新的代码包,https://www.python.org/downloads/
copy到服务器上,解压;
./configure
make & make install
期间,报错,报错ModuleNotFoundError: No module named '_ctypes'
解决办法:3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装
#yum install libffi-devel -y
#make install
最后会在/usr/local/bin里有程序包;
运行python3 -V即可显示正确的version;

2 安装ssl
libssl-dev是ubuntu系统的库,而centos系统对应的是openssl-devel ,
所以运行centos中运行yum install openssl-devel,ubuntu系统运行apt-get install libssl-dev

3 linux 离线安装gcc4.8.5:
1 获取离线安装包: https://pan.baidu.com/s/1J-wVsAoTmfn_iiOnYSrmZA 密码:beee
2 将这些包上传到待安装的系统中,执行安装命令:
rpm -ivh *.rpm --nodeps --force
3 装好时候报错: libc.so.6: version `GLIBC_2.14' not found
https://blog.csdn.net/qq805934132/article/details/82893724
https://blog.csdn.net/cpplang/article/details/8462768/

4 安装高版本的gcc(至少5.3.1以上);
yum install centos-release-scl
yum install devtoolset-4-gcc-c++-7.3.1
source /opt/rh/devtoolset-7/enable
gcc --version

注意:有些机器不支持安装5.3.1 通过命令【 yum --disablerepo="*" --enablerepo="*scl*" search gcc 】来看库中有声明版本;
source /opt/rh/devtoolset-7/enable 每次运行前source一下;

注:yum可能出错:报错如下:
  #yum
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax

原因:这是因为yum 采用python作为命令解释器,但是有时候我们python默认为3.5,但是yum只支持2.7;所以报错;
修改/usr/bin/yum文件第一行,#!/usr/bin/python改成#!/usr/bin/python2.7即可;

5 xshell使用
直接复制渠道,可以避免每次输入token和密码;
工具->选项->键盘和鼠标,可以设置快捷键,提升工作效率;

六 GPU & nvidia

1 常用gpu型号

  NVIDIA Tesla系列GPU适用于高性能计算(HPC)、深度学习等超大规模数据计算,Tesla系列GPU能够处理解析PB级的数据,速度比使用传统CPU快几个数量级,NVIDIA Tesla GPU系列P4、T4、P40以及V100是Tesla GPU系列的明星产品,云服务器吧分享NVIDIA Tesla GPU系列P4、T4、P40以及V100参数性能对比:

  NVIDIA TESLA V100,采用NVIDIA Volta架构,适合要求苛刻的 双精度 计算工作流程,渲染性能比Tesla P100提升了高达80%,每个GPU均可提供125 teraflops的推理性能;

  NVIDIA TESLA P40,支持多种行业标准的2U服务器,可提供出色的推理性能、INT8精度和24GB板载内存;

  NVIDIA TESLA T4,帧缓存高达P4的2倍,性能高达M60的2倍;

  NVIDIA TESLA P4,能效高达CPU的60倍;

  性能&价格:Tesla V100 > Tesla P40 > Tesla T4 > Tesla P4

    注:T4,架构更高级,技术更先进,超过P4;P40技术落后一点,但是核心多,显存大,所以价格可能会贵点;

2 gpu信息查看

  运行nvidia-smi

linux&shell操作大全第3张

  • Fan:显示风扇转速,数值在0到100%之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A;
  • Temp:显卡内部的温度,单位是摄氏度;
  • Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能;
  • Pwr:能耗表示;
  • Bus-Id:涉及GPU总线的相关信息;
  • Disp.A:是Display Active的意思,表示GPU的显示是否初始化;
  • Memory Usage:显存的使用率;
  • Volatile GPU-Util:浮动的GPU利用率;
  • Compute M:计算模式;
  • 查看显存:即Memory Usage下边,已经使用/总显存,图中,15079Mib,16097Mib即显存,15G和16G;

免责声明:文章转载自《linux&shell操作大全》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在鲲鹏916服务器上编译和安装dpdk踩坑zbb20170613 linux 安装 mysql下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Git】4、创建代码仓库,HTTP、SSH拉取远端代码

拉取远端代码:使用Git命令下载远程仓库到本地 文章目录 拉取远端代码:使用Git命令下载远程仓库到本地 1、创建远程代码仓库 2、创建仓库 3、进入仓库 4、HTTP(S)获取远程仓库 首次拉取 更新代码 临时记住密码 永久记住密码 5、 SSH拉取 拉取代码 创建一个ssh key 添加公钥到服务器 再次拉取代码 更新代码 6、小结 H...

Ubuntu 环境变量

环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 2、/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。 3、~...

linux_流处理_sed

1. Sed简介    sed 是 一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处 理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输 出。Sed主要用来自动编辑一个...

Linux学习之路--shell学习

shell基础知识 什么是Shell Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户、shell和操作系统的关系: Shell也...

redhat安装Xvfb

1.下载xvfb的rpm包进行安装 下载rpm安装包:http://rhn.redhat.com/errata/RHBA-2013-0083.html 安装rpm包:#rpm -ivh --nodeps --force xxx.rpm 启动:#Xvfb -ac :7 -screen 0 1280x1024x8 #export DISPLAY=:7 测试:#...

shell中的dd命令使用详解

一、dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2 参数注释: 1. if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file > 2. of=文件名:输出文件名,缺省为标准输出。即指...