一个偶然的原因,在研究git使用时,发现有个自动启动的git-daemon进程:

wellbye@AY130622174524343529Z:~$ ps aux|grep git
root 0.0 0.0 ? Ss : : runsv git-daemon
gitlog 0.0 0.0 ? S : : svlogd -tt /var/log/git-daemon
0.0 0.0 ? S : : /usr/lib/git-core/git-daemon --verbose --reuseaddr --base-path=/home/git/repositories --syslog
wellbye 0.0 0.0 pts/ S+ : : grep git

于是便想知道这个进程是怎么启动的,怎么调整其启动参数。因为最初的命令行参数里--base-path指向/var/cache/git,当然不是我想要的,为了能将其改为自己的仓库路径,自然就要了解其启动过程。

man了大半天,又bg了半天,基本知道了这是由runit包提供的一个进程监控机制,对指定的进程(一般是后台服务)进行监控,发现其挂了就会自动重启。同时它也提供了对外操作接口,可以通过管道与其通讯,默认提供了一个sv命令行程序来控制(被监控)进程的启停。

首先,在/etc/service/下面,有一堆子目录,这里每一个目录代表了一个要监控的服务,目录里面要放一些脚本文件如run/finish/down等等,分别会在各种时机被调用。对git-daemon来说,只有一个run脚本:

root@AY130622174524343529Z:/home/wellbye# ls -al /etc/service/git-daemon/
total
drwxr-xr-x root root Jul : .
drwxr-xr-x root root Jun : ..
drwxr-xr-x root root Jun : log
-rwxr-xr-x root root Jun : run
lrwxrwxrwx root root Jun : supervise -> /var/lib/supervise/git-daemon

其内容很简单,就是真正启动目标进程:

root@AY130622174524343529Z:/home/wellbye# cat /etc/service/git-daemon/run
#!/bin/sh
exec >&
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
"$(git --exec-path)"/git-daemon --verbose --reuseaddr \
--base-path=/home/git/repositories --syslog

chpst是改变进程属性的指令,-u意指修改所属用户,因为runsv都是由root启动的吧所以这里把用户改为专用于git的gitdaemon。要改变的进程则是后半句里启动的git-daemon进程。整个句子颇有点宾语从句的味道。。那么,要修改启动参数的话,就是在这里改了。

整个机制的总控进程是runsvdir,它会读取相应目录下的各个“服务配置”,为每一个“服务”分配启动一个runsv进程去监控执行,一个svlogd进程去写log。

runsvdir自身则是在系初始化时启动的,对ubuntu来说,它本身又是更高层级服务upstart里的一个条目:

root@AY130622174524343529Z:/home/wellbye# ls -l /etc/init/|grep runsv
-rw-r--r-- root root Mar : runsvdir.conf

其内容就是在系统启动时,运行runsvdir-start进程,也就相当于 runsvdir /etc/service,即把/etc/service下面列出的服务启动并监控起来:

root@AY130622174524343529Z:/home/wellbye# cat /etc/init/runsvdir.conf
start on runlevel []
stop on runlevel []
respawn
kill signal HUP
exec /usr/sbin/runsvdir-start

对于这些服务,可用“sv 命令 服务名”来控制查询其状态:

root@AY130622174524343529Z:/home/wellbye# sv d git-daemon
root@AY130622174524343529Z:/home/wellbye# sv s git-daemon
down: git-daemon: 4s, normally up; run: log: (pid ) 64894s
root@AY130622174524343529Z:/home/wellbye# sv u git-daemon
root@AY130622174524343529Z:/home/wellbye# sv s git-daemon
run: git-daemon: (pid ) 5s; run: log: (pid ) 64915s

概念大致就如此了。一个奇怪的问题是,之前我想用“sv d git-daemon”去停止git服务,以便测试客户端clone还能否运行,但结果怎么都杀不掉git-daemon进程,还以为是用法有问题搜索了很久也没答案,倒是也见到不少帖子说有类似现象的,说是的svlogd进程未能及时退出,导致后续响应失常,被杀的git-daemon进程又被重启了。直到我重启系统后,发现这个问题没了,每次u/d都正常有效,也许这确实是个bug吧。

ubuntu上runsv/runit小记的更多相关文章

  1. 【转】Ubuntu 18.04安装小记

    我的电脑是神舟z7 kp7s1,显卡1060,尝试了Ubuntu的16.04,安装完进入界面总是卡死了,后面换18.04依然无解,和版本无关,而是因为英伟达的显卡问题. 参考了如下这篇文章:Ubunt ...

  2. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  3. Ubuntu 上搭建 Samba 服务器

    由于经常要接收同事发送的一些文件,U盘拷来拷去的很麻烦. 在本机Ubuntu上搭了各Samba服务器,过程中遇到点小问题,记录一下 sudo apt-get install samba 创建一个共享目 ...

  4. 微软KinectV2深度传感器在Ubuntu上的配置和使用

    最新博客地址已转到: http://blog.csdn.net/zzlyw?viewmode=contents   ------------------------------------------ ...

  5. .NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)

    编译时间:北京2015年6月17日上午 操作系统:Ubuntu 14.04.2 LTS Mono版本:Mono JIT compiler version 4.3.0 (master/3445ac5 T ...

  6. [异常解决] ubuntu上安装JLink驱动遇到的坑及给后来者的建议

    一.前言 最近将整个电脑格式化,改成了linux操作系统 希望这样能让自己在一个新的世界探索技术.提升自己吧- win上的工具用多了,就不想变化了- 继上一篇<ubuntu上安装虚拟机遇到的问题 ...

  7. Ubuntu上安装Robomongo及添加到启动器

    到目前为止,Robomongo仍是MongoDB最好的客户端管理工具,如需在Ubuntu上安装Robomongo,可直接从官网下载.tar.gz压缩包进行解压,然后直接运行bin目录下的robomon ...

  8. 介绍两个Ubuntu上的桌面小工具

    经常使用Windows10,Sticky Notes和壁纸自动切换功能挺好用的.我经常会使用Sticky Notes来记录一些信息,内容是实时保存的,而且启动的时候会自动显示在桌面上.其实Ubuntu ...

  9. 在 Ubuntu 上安装 Android Studio

    在 Ubuntu 上安装 Android Studio http://www.linuxidc.com/Linux/2013-05/84812.htm 打开terminal,输入以下命令 sudo a ...

随机推荐

  1. linux通过脚本获取内存信息

    1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...

  2. castle windsor学习-----How components are created

  3. 算法(Algorithms)第4版 练习 1.3.42

    After copy Left on Stack r: be to not or be to Left on Stack copy: be to not or be to After r pop Le ...

  4. Java -- Properties类使用 读取配置文档

    Java-Properties类的使用 分类: Java基础 2007-05-11 19:35 2666人阅读 评论(1) 收藏 举报 propertiesxmlimportexceptionstri ...

  5. BZOJ 1965 [Ahoi2005]SHUFFLE 洗牌:快速幂 + 逆元

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1965 题意: 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两 ...

  6. php: +1天, +3个月, strtotime(): +1 day, +3 month

    php: +1天, +3个月, strtotime():  +1 day, +3 month 比如,我现在当前时间基础上+1天: strtotime("+1 day"); 比如我现 ...

  7. hdu 1003 Max Sum(基础dp)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. codeforces 652B B. z-sort(水题)

    题目链接: B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. Cassini(卡西尼)投影

     

  10. Operating System-Process(1)什么是进程&&进程的创建(Creation)&&进程的终止(Termination)&&进程的状态(State)

    本文阐述操作系统的核心概念之一:进程(Process),主要内容: 什么是进程 进程的创建(Creation) 进程的终止(Termination) 进程的状态(State) 一.什么是进程 1.1 ...