共计 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 小编会继续努力为大家带来更多实用的文章!