Skip to content

Instantly share code, notes, and snippets.

@zhengkai
Last active December 10, 2020 02:52
Show Gist options
  • Save zhengkai/de75b5a1c547df376d5cb11ff2b2514c to your computer and use it in GitHub Desktop.
Save zhengkai/de75b5a1c547df376d5cb11ff2b2514c to your computer and use it in GitHub Desktop.
Make 实践

Make 实践

这只是我个人摸索出来的方法,不确认是否是“最佳”实践

很多时候写的东西无法热更,如我目前正在写一些 golang 和 nodejs 的东西。总之一个常见需求是需要快速重启一个 server 以用来调试。

首先有一个启动脚本,做以下必要操作,并且在敲 make 的时候不带参数时会默认执行

  1. 关闭之前运行的 server(如果有)
  2. 初始化环境(如没有 node_modules 目录则 npm i
  3. 初始化配置
  4. 启动 server 并记录 PID 到文件

如果分得细一些(比如在 golang 里),启动是分 build 和 start 两个动作,例如开机自动运行只跑 start,只有手敲 Make 的时候才会 build + start。

启动细节

记录 PID 是很重要的一点,我见过很多人在启动脚本里使用 killall,甚至有人根本不知道如何正确在一台电脑上启动多个实例,如果一定要做,他们只会用 ps aux | grep 来肉眼识别并手动 kill

在 bash 脚本里,可以用 $! 来获取前一个命令的 PID。

kill 的时候要注意,因为记录在文件里的 PID 可能失效了(比如你电脑重启过,但是 PID 文件还在),而恰好有别的程序占用了这个 PID,可能会 kill 错,所以我写了个脚本 safe-kill.sh 来操作,它需要第二个参数,是你所运行的程序完整路径,看 safe-kill.sh 的代码可知,就是从类似 /proc/10230/exe 这种路径的软链指向,来确认是否是想 kill 的程序。

另外有时候我可能在一台电脑上运行很多个 server,我喜欢启动的时候用完整绝对路径,
这样不会在 ps 的看到一堆诸如 node ./app 而无从下手。

日常使用

我的习惯是,而 make 启动的脚本,会 nohup 启动并重定向标准输出,由专门的窗口去 tail -f 看 log,这样在任何窗口都可以敲 make(还有个小细节是每次 make 时前一个文件不要删,而是改名为类似 prev.log,可能用到)

我略微改进make:如果当前目录没有 Makefile 文件,它会不断向上一级目录查找,这样在很深的子目录也可以 make。

我也写了个 VIM 脚本 来在编辑器里用热键执行 make,如果一切顺利只会在状态栏下面有行提示,如果失败则显示整个 make 输出。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment