Apollo 启动脚本解析

Apollo 启动脚本解析

sudo service docker start -- 是在ubuntu14.04中打开

在dev_start.sh脚本中会调用restart_map_volume.sh脚本

dev_start.sh中的脚本解析

  • dirname命令解析:
    • dirname命令去除文件名中的非目录部分,仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出。
    • dirname /a/b/的结果为:/a
  • DIR="\(( cd "\)( dirname "${BASH_SOURCE[0]}" )" && pwd )"详解;
    • \({BASH_SOURCE[0]}表示bash脚本的第一个参数(如果第一个参数是bash,表明这是要执行bash脚本,这时"\){BASH_SOURCE[0]}"自动转换为第二个参数);
    • ${BASH_SOURCE[0]} 表示bash docker/scripts/dev_start.sh中的docker/scripts/dev_start.sh部分;
    • cd "$( dirname "${BASH_SOURCE[0]}" )表示切换到执行目录;
    • pwd是获取当前目录;
    • APOLLO_ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"表示APOLLO的根目录,这样的话不管是这么执行的都可以得到根目录。
  • Linux shell脚本的if条件判断语句:
    • 基本语法:
    if[command]; then
        符合该条件执行的语句
    fi
    
    • [ ]表示条件测试(中括号两边一定要有空格);
    • if判断中对于变量的处理,需要加引号,以免一些不必要的错误;
    • 如果只单独使用>或者<号,系统会认为是输出或者输入重定向;
    • 运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中;
    • 使用-z或者-n来检查长度的时候,没有定义的变量也为0;
    • 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下;
    • ? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态);
    [ INT1 -eq INT2 ]          INT1和INT2两数相等返回为真 ,=
    [ INT1 -ne INT2 ]          INT1和INT2两数不等返回为真 ,<>
    [ INT1 -gt INT2 ]           INT1大于INT2返回为真 ,>      # greater than
    [ INT1 -ge INT2 ]          INT1大于等于INT2返回为真,>=    # greater equal
    [ INT1 -lt INT2 ]            INT1小于INT2返回为真 ,<     # less than
    [ INT1 -le INT2 ]           INT1小于等于INT2返回为真,<=
    
  • ln命令:
    • ln的功能是为某一个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,使用软链接ln命令就可以了,而且不会占用重复的磁盘空间。
    • 硬链接(hard link)与软链接(symbolic link):
      • 硬链接的意思是一个档案可以有多个名称;
      • 软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。
      • 硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
    • 软链接: 软链接是以路径的形式存在,类似Windows下面的快捷方式;软链接可以跨文件系统,硬链接不可以,软链接可以对一个不存在的文件名进行链接;软链接可以对目录进行链接;
    • 硬链接: 硬链接以文本副本的形式存在,但不占用实际空间,不允许给目录创建硬链接;硬链接只有在同一个文件系统中才能被创建。
    • ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化; ln的链接又分软链接和硬链接两种,软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
     ln [参数][源文件或目录][目标文件或目录]
    -b 删除,覆盖以前建立的链接
    -d 允许超级用户制作目录的硬链接
    -f 强制执行
    -i 交互模式,文件存在则提示用户是否覆盖
    -n 把符号链接视为一般目录
    -s 软链接(符号链接)
    -v 显示详细的处理过程
    
  • 什么是coredump:
    • 程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。
    • core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等。
    • 可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
    • coredump文件的存储位置: core文件默认的存储位置与对应的可执行程序在同一目录下,文件名是core, 通过cat /proc/sys/kernel/core_pattern查看core文件存在的位置。
  • tee命令解析: 重定向输出到多个文件。
    • tee file:输出到标准输出的同时,保存到文件file中。如果文件不存在,则创建;如果已经存在,则覆盖之。
    • tee -a file: 输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建;如果已经存在,就在末尾追加内容,而不是覆盖。
    • tee -: 输出到标准输出两次。
    • tee file1 file2 -: 输出到标准输出两次,同时保存到file1和file2中。
  • source 命令:
    • source FileName: 在当前bash环境下读取并执行FileName中的命令; 该命令通常用命令“.”来替代。
    • 这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。
    • source filename 与 sh filename 及./filename执行脚本的区别:
      • 当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别的。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。
      • sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。
      • source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
  • bash的while循环
    while 条件
    do
        循环体
    done
    
  • Shell case语句用法小结
  • shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本),在while中循环查找命令行参数。
  • docker镜像的介绍
    • docker pull:从 docker registry 拉去镜像;
  • for map_name in ${DEFAULT_MAPS[@]}; 可以遍历shell数组中所有的元素。
  • shell脚本中,单括号与双括号的区别
    • 单括号[是shell的内置命令, 而[[是shell的关键字。
    • 在[[中使用&&和||表示逻辑与和逻辑或。
    • [[支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
  • dev_start.sh脚本就是设置Apollo的一个Docker环境。

rosbag_helper.py脚本相关

  • python中if __name__ == "__main__":的理解:
    • if name == 'main'的意思是:当.py文件被直接运行时,if name == 'main'之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main'之下的代码块不被运行。
  • __name__是内置变量,可用于反映一个包的结构。
  • __main__文件

release_into.sh相关

  • release_into.sh的内容很少:
xhost +local:root 1>/dev/null 2>&1    #关闭访问控制权, 标准输出重定向到空设备, 标准错误也重定向到标准输出
docker exec \      # 运行Apollo_release的版本
    -u $USER \     # -u,用户名或UID
    -it apollo_release \ # -i :即使没有附加也保持STDIN 打开, -t :分配一个伪终端
    /bin/bash
xhost -local:root 1>/dev/null 2>&1   # 打开访问控制权
posted @ 2018-12-03 17:07  coding-for-self  阅读(2178)  评论(0编辑  收藏  举报