这是一道Shell Good Coder考试题
runit
是一个应用(application)启动管理工具。通过Procfile
文件启动相应的进程。
Procfile
包含进程名字和启动进程的命令,用:
分隔。如:
web: python -m SimpleHTTPServer $PORT
date: date $DATE_FORMAT
web_2: while true ; do nc -l $PORT < index.html
- 进程名字可以包含:字母, 数字, 下划线
Procfile
中不可以写后台命令runit
将这些命令运行在后台runit
默认使用当前路径下的Procfile
文件- 如果多次使用
$PORT
变量,则值递增。如第一个$PORT
的值是8080
,则第二个$PORT
的值为8081
,如果不在.env
中设置$PORT
变量的值,则自动设置默认值为8080
如果当前目录下存在.env
文件,则从其中读取环境变量。这个文件由 键/值对 构成。如:
PORT=8080
DATE_FORMAT='+%Y-%m-%d|%H:%M:%S'
runit
启动Procfile中的所有进程runit -f procfile -e env_file
runit -c
检查Procfile, env_file文件格式的正确性runit -h
打印帮助
Procfile
和.env
文件中可存在#
注释- usage内容第一行如下, 其余内容自由发挥
Usage: runit [-c] [-f procfile|Procfile] [-e envfile|.env]
- 日志打印到屏幕,格式如下,不同的进程的日志输出不同的颜色(web, date, web_2分别是不同的颜色)
11:39:45 web | python -m SimpleHTTPServer 8080 started with pid 781
11:39:45 date | date +%Y-%m-%d|%H:%M:%S started with pid 790
11:39:45 web_2 | nc -l 8081 < index.html started with pid 801
runit
按照Procfile
的描述启动进程,例如web就是启动一个前台进程(非后台进程或daemon)runit
可以接收SIGINT和SIGTERM信号,杀掉已启动的进程。确保runit
在子进程运行结束后才退出。(如果进程可瞬间完成或是后台进程,则这个功能不起作用)- 除
grep
外不允许使用其他外部命令,如:sed, awk, ps, bc
- 遵循shell编程规范
- 如果仍不明白题目,请看这个帮助视频
- "Colorizing" Scripts
- Parameter Substitution
- String Operations
- wait
- getopts
- trap
- POSIX Character Classes
- printf
- 列出所有builtin:
help
。验证一个命令是否是builtin:type -a <command>
- 将一个string作为代码执行:
bash -c "${command}"
## 0. 安装git
## 1. 获取代码
git clone http://gitlab.xxxxx.com/cmc-shell/runit.git
## 2. 编写代码
vim runit
## 3. 运行测试,确保所有测试用例通过
make test
## 4. 运行一个典型的Procfile
make run
## 5. 提交代码评审
upload.py
## 仅提交runit即可
- 跑过测试用例(必要条件)
make test
- 确认程序启动后的行为
make run
## 程序屏幕输出及颜色
## Ctrl + C 之后进程是否被干净的杀掉
- 阅读代码
## 代码风格
## 命名准确性
## 改进性建议(更好的写法,潜在的bug和风险)