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   # 打開訪問控制權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM