共計 5058 個字符,預計需要花費 13 分鐘才能閱讀完成。
這篇文章主要介紹“Linux 下服務器端開發流程是什么”,在日常操作中,相信很多人在 Linux 下服務器端開發流程是什么問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux 下服務器端開發流程是什么”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
熟悉 Linux 操作
任務管理
有時候你在命令行里執行拷貝大文件的命令,這個命令很耗時,會獨占終端,此時可以先使用 Ctrl+z 命令讓當前任務 (job) 掛起,此時可以輸入命令了,然后使用 bg 命令讓當前掛起的任務去后臺 (background) 運行。
利用 jobs 命令可以查看當前在后臺運行的程序及 job-id,然后想讓它到前臺來運行,可以執行 fg [%job-id] 來讓它恢復到前臺執行
如果想 kill 掉當前在后臺運行的某個任務怎么辦? 使用 kill %job-id
開發環境搭建
我們這邊操作系統都是 Red Hat Enterprise Linux 5, 機器都是 X86 架構,64 位機器。這邊代碼文件默認都用 GBK 的編碼
登錄機器的配置集團的跳板機,ssh 的配置是會在一段時間不操作之后自動斷掉的,而且每次登錄上去都需要輸入密碼 +token,利用 ssh 的 ControlMaster, 就可以解決,方法見我的 ssh 配置在 linux 下,有很多窗口管理器,可以在一個窗口里進行多個獨立的會話[不需要開多個終端],進行會話恢復[即使網絡連接中斷,用戶也不會失去對已經打開的命令行會話的控制],推薦 screen 默認的 screen 配置有些蹩腳,而且跟 shell 快捷鍵有些沖突。配置好了之后界面顯示就很強大了, 可以參考我的 screen 配置對應上述配置的 screen 快捷鍵: Ctrl+j,c 創建新會話 Ctrl+j,d detach
GNU 工具鏈在刻的操作系統里已經有了,常用的是:* GNU make: 編譯 (compile) 和構建 (build) 的自動化工具 * GNU 編譯器集合:GCC* GNU 二進制工具: 包含鏈接器 (linker),匯編器(assembler) 和其他工具
代碼編輯我一開始使用的 vim,基本不安裝什么插件,后來投入了 emacs 的懷抱,主要是 emacs,eshell 和 gdb 搭配起來,不僅能夠滿足我的日常需求,而且讓我感覺效率大大提升,而且 emacs 環境安裝也比較簡單。但是在咋們公司的服務器上,vim 是標配,emacs 需要自己裝。用習慣了 emacs,再切回到 vim 時,好多快捷鍵都忘了,十分痛苦!Vim 新手入門資料和一些 Vim 實用小技巧 Linux 環境下 shell 和 vim 中亂碼原因及消除辦法 新手經常被亂碼問題困擾,這篇文章探究了一下 shell 和 vim 中亂碼原因及解決辦法 emacs 安裝及使用 ,現在這里挖個坑吧,后續有時間再寫如果在 Windows 下看代碼,推薦 Source Insight, 非常好用,誰用誰知道。
代碼版本管理
目前直通車這邊代碼版本管理使用 svn 常用命令:
查看本地代碼做了哪些改動 svn st -q
提交代碼 svn ci filepath/ -m svn comments
查看兩個版本之間的改動有哪些 svn diff -r r1:r2 svn diff -r r1:r1 –summarize # 此命令是摘要模式,只展示哪些文件改動,不展示具體的文件內容 diff
創建分支 svn cp http://destpath/trunk http://destpath/branches/my-branch/ -m create branche for xxx
合并分支代碼到主干 svn merge -r 14829:HEAD my/branch http://path/to/trunk 上述命令表示把本地的 my/branch 所代表的 svn 路徑的 14829 到最新版本的代碼,merge 到 http://path/to/trunk 路徑下。如果是正常拉出來的分支,也可以不加版本參數,svn 能自動計算出分支的起始版本號新人合并代碼的時候一定要注意一下,提交之前再確認下合并的代碼是否 OK,如果有不明白的地方,多請教師兄
查看某段代碼最后是誰改的 svn blame filename
更新指定文件到某個指定的版本 svn up -r rev file
撤銷某文件本地的改動 svn revert file #這條命令要謹慎使用,使用之后自己的改動就找不回來了
解決沖突的命令如果 svn merger 后提示:local add, incoming add upon merge 用如下命令來采納本地的修改來解決:svn resolve –accept working -R [–recursive]
在 Mac 下,推薦使用圖形界面的 Meld 來作為 svn 的 merge 工具,可以很方便的處理沖突,減少合錯代碼的可能性
開發[被測試戲謔為寫 bug 的階段]
開發之前,最好了解如下這些東東:
Makefile 用來完成自動化編譯的東東相關資料可以參考陳皓寫的跟我一起寫 Makefile 系列, 網上可以搜到熱心網友整理的 pdf 版本。看完前面 4 章就夠用了,后面的章節可以在遇到疑惑的時候再去查閱。可以通過以下幾個常見問題來檢驗自己有沒有理解整個工程的 Makefile 如何修改 Makefile 來編譯出帶 / 不帶 gdb 調試信息的版本如何去掉 / 加上編譯器優化選項,如 -O2 參數新加入頭文件 (一般都是.h 結尾的),源文件(一般都是.cpp 結尾) 后,如何在 Makefile 中加入相應的規則。新加入的這個文件可能最終是放到靜態庫.a 里面,也可能是放到動態庫.so 里面,也可能是直接生成可執行程序的一般都不直接寫 makefile,而是使用 cmake(cross platform make)來生成 makefile,然后再按照 make 的方式構建軟件。進階讀物:如何調試 Makefile 變量
關于靜態庫和動態庫需要了解的東西有 What: 什么是靜態庫,什么是動態庫 How: 如何生成靜態庫, 動態庫 Why: 靜態庫和動態庫的差異,什么情況下使用靜態庫,什么情況下使用動態庫
以上問題都可以在 LibraryArchives-StaticAndDynamic,shared libraries 里得到解答
參考資料:
菜鳥在 C 語言編譯,鏈接時可能遇到的兩個問題
編程大牛云風推薦的書 程序員的自我修養 – 鏈接、裝載與庫
編程大牛老趙推薦的書 深入理解計算機系統 書很厚,可以挑著看自己關心的章節
GNU 編譯工具 GCC 至少需要知道一些常用的選項參數:定義輸出文件的名稱產生 gdb 調試的信息控制代碼優化級別只進行預處理過程 可以幫助調試一些宏定義 / 頭文件包含產生的問題只進行編譯過程只進行鏈接過程可以通過 man gcc 來獲得上述問題的答案, 也可以自行 google,google 被墻了可以用這個 ask
GNU 調試器 gdb 程序執行結果錯誤怎么辦? 單測過不了怎么辦? 線上出 Core 了怎么辦? 別著急,GDB 來幫你忙。新手如何在 gdb 中存活 通過一個小例子來讓新手快速上手, 搞會了里面的內容,就基本夠用了 GDB 中應該知道的幾個調試方法一些我搜刮到的 gdb 命令[會持續更新進來,歡迎大家回復]:查看指針數組中的內容 p /x *address@len 以 16 進制方式顯示 address 開頭的 len 個元素通過 gdb 啟動程序后,如何調試 fork 出來的子進程:set follow-fork-mode child 直通車這邊的服務基本都是多進程的模型,首先啟動一個 daemon 父進程,然后再 fork 出多個執行業務邏輯的子進程。如果子進程掛掉,父進程會重啟一個子進程。
多線程支持
目前直通車這邊多線程機制使用的都是 POSIX Theads
對于 POSIX Theads,需要了解:
What: 什么是 thread,pthread
How: 如何使用 pthread 如何編譯多線程程序如何創建 / 結束線程如何等待子線程返回 (join/detach) 多線程之間如何使用互斥鎖 (Mutex) 來同步、加鎖、避免競爭條件的出現?
Why: 為什么使用 pthread, 而不是其他
以上問題,都可以在這個美國勞倫斯利弗莫爾國家實驗室的 pthead 教程里面找到答案
查找 / 替換字符串 / 查找文件 / 文本處理
想查找某個宏 / 函數的定義怎么辦?grep -r –include=*.{cpp,h} NGX_HTTP_VAR_INDEXED src/ 本命令的意思是在 src 目錄下,以遞歸的方式在.cpp 或者.h 結尾的文件里查找 NGX_HTTP_VAR_INDEXED 這個字符串
想找某個模糊記得名字的文件怎么辦?find ./ -iname *util.h 本命令意思是在當前目錄下, 基于忽略大小寫的文件名稱來查找文件,文件名稱是正則表達式 *util.h 關于正則表達式,我只看 deerchao 的這個文章:正則表達式 30 分鐘入門教程另外有一個 web 應用 regexr 特別好使,可以幫助我們調試正則表達式
文本處理流式編輯器 sed 例如替換某字符串: sed -i s/oldvalue/newvalue/g 關于 sed, 可以看酷殼上的 sed 簡明教程文本處理語言 awk 關于 sed, 可以看酷殼上的 AWK 簡明教程
進階讀物:
應該知道的 Linux 技巧
28 個 Unix/Linux 的命令行神器
關于單測(unit test)
單測十分重要, 它能夠讓你對你的代碼更加有底氣和信心,而且能夠幫助你更早的發現問題,解決問題。在開發的各個階段,問題發現的越晚,解決問題的成本就越大。這邊 C ++ 的單測都用的 Google 的 gtest 框架, 即使之前不了解 gtest 框架,看著別人的代碼照貓畫虎也可以寫出單測來,但是最好去看一下 gtest 官方文檔,去全面了解一下 gtest,去拓展一下自己的思維。
寫著寫著代碼,就發現自己的代碼越來越復雜,不容易閱讀,設計混亂怎么辦? 可以后臺私信【學習資料】獲取資料
編譯(compile), 構建(build)
編譯之前的準備工作需要把編譯依賴環境搞定,基本就是裝好編譯依賴的包就可以了。可以在 rpm 目錄下找到對應的 spec 文件,然后使用 t-abs 命令[用于本地調試 spec 文件和自動部署編譯環境],來幫助我們裝好編譯依賴的包,即 spec 文件中的 BuildRequire 部分指定的包關于 rpm 和 spec 文件,可以通過閱讀這篇來了解:How to create an RPM package
編譯找到對應工程的 Makefile,然后執行 make 命令,就可以編譯構建工程了由于 make 本身的靈活性,而 Makefile 的可讀性又不強,是以文件為單元,抽象層次不夠,Google 開發了分布式的構建系統 Bazel,能夠把程序員從 make 的語法和文件級別的構建上解放出來。Bazel 相關資料有:Google Blaze 原理及 Bazel 的使用方法介紹
目前我們這邊目前還在用 RPM 來進行包的管理
平常需要用到的 rpm 命令有:rpm -qf file-name 來查看某個文件到底是哪個 rpm 包里面的 rpm -qi package-name 來查看這個 rpm 包相關的信息,比如打包時間,svn 地址等 rpm -ql package-name 來查看這個 rpm 包中到底有哪些文件 rpm -qV package-name 來驗證這個 rpm 包安裝后的文件有沒有被修改過, 在懷疑 rpm 包的配置 / 腳本被人修改過的時候非常有用
代碼 review
UI 界面:reviewboard, 提交的時候使用 rbt 命令:rbt post r1 r2 來提交 r1 和 r2 這兩個版本之間的 diff 作為 code review 提交之后可以得到一個 reviewboard 地址,然后需要在這個地址里填上 codereview 的人員和相關的描述等
持續集成 CISE
CISE 為用戶提供自動化的環境部署和測試服務這塊兒每個公司使用的都是不同各的
安裝包
對于構建出來的 rpm 包, 使用 yum 來安裝。
淘寶 rpm 包查詢 UI 這里可以查看到淘寶 yum 源里面現存的各個包版本 可以從里面看到對應包的 abs 地址
使用如下命令安裝:
__sudo yum install -b test t-imatch-kgb-updated __
-b 參數用來指定當前安裝包 t -imatch-kgb-updated 在 test 分支還是 current 分支里面上線時候的包必須轉成 current
到此,關于“Linux 下服務器端開發流程是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!