• linux&shell操作大全


    一 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;生成调用关系图,如下:

    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每一个用户都属于一个组,不能独立于组外。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  符号改变法实际上就是对不同实体设置权限,其中我们只要懂的三个部分的含义就可以

    chmod u +(加入) 文件或目录
    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

    • 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;
  • 相关阅读:
    PHP中遍历stdclass object
    php获取post中的json数据
    PHP的范围解析操作符(::)的涵义
    编程笔记之—sina&tqq api—MBApiClient 与 WeiboClient 冲突
    asp.net开发mysql注意事项
    vs2010 和 svn的结合运用,svn的安装
    asp.net 调用 mysql 存储过程 MySql.Data.MySqlClient.MySqlException: Unhandled type encountered
    asp.net 调用 mysql 分页存储过程,repeater使用mysql分页存储过程,mysql 存储过程的注意事项
    如何把其他项目中编写好的 自定义控件 放到自己的项目里面使用 (MultiListBox ASP.NET控件)
    jqPlot——基于jquery的图表绘制工具简单使用,jqPlot 在firefox 火狐浏览器里面,图表右侧的标题,变形的解决方法
  • 原文地址:https://www.cnblogs.com/hanlaomo/p/14283034.html
Copyright © 2020-2023  润新知