一个偶然的原因,在研究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. android 电池(三):android电池系统【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/8709838 一.电池系统结构 Android中的电池使用方式主要有三种:AC.USB. ...

  2. Spark- 常见问题

    记录spark使用中常见问题 SparkSQL 日期解析时用到SimpleDateFormat, SimpleDateFormat是线程不安全的.可以使用 FastDateFormat 如: impo ...

  3. Ueditor--toolbars

    (1)代码中定义 <script id="container" name="content" type="text/plain"> ...

  4. SpringBoot_05_热部署和debug

    一.pom.xml配置 增加以下pom.xml配置 <!--1.spring-boot插件--> <plugin> <groupId>org.springframe ...

  5. PHP如何得到数组最后元素的key

    1.array_keys(end($arr)) $array = array( 'one'=>1, 'two'=>2, 'three'=>3, 'four'=>4, ); $a ...

  6. 关于MFC消息的总结

    一.MFC的消息类型 MFC的消息类型大致可以分为三种: 1.命令消息.由菜单和工具栏或快捷键产生,以WM_COMMAND形式发出(以WM_COMMAND发出的还有很多控件,如Button等,但它们产 ...

  7. codeforces 650D D. Image Preview (暴力+二分+dp)

    题目链接: http://codeforces.com/contest/651/problem/D D. Image Preview time limit per test 1 second memo ...

  8. python的random模块及加权随机算法的python实现

    random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. ...

  9. leetcode 2 Add Two Numbers(链表)

    数字反过来这个没有什么麻烦,就是镜像的去算十进制加法就可以了,然后就是简单的链表. /** * Definition for singly-linked list. * struct ListNode ...

  10. SSH Secure Shell 的使用

    一,安装Secure Shell ,之后会出现SSH Secure Shell client 和SSH Secure File Transfer client 两个快捷方式. 需要服务器的IP地址,用 ...