看来 upstart 是在重启过程中关闭和启动它们的正确方法,但我在搜索 SubGit 文档和网络常规搜索后未能找到配置文件。
我的情况中的启动和停止命令很简单,但是用户名和 repo 路径都依赖于用户安装:
sudo -u subgit subgit install /dev.git # start
sudo -u subgit subgit uninstall /dev.git # stop
我即将实现 /etc/init/subgit.conf 的工作副本(不要与 SubGit 中的 SVN_REPOS/conf/subgit.conf 混淆)并将发布等待更好的答案。
注意:SubGit 是桥接 Subversion 和 Git 的一种特殊实现。
答案1
尽管启动命令很简单,但它调用了一个 Java 程序,该程序似乎会多次 fork,从而导致 upstart 问题。幸运的是,约翰·詹姆斯·米勒发布解决方法针对此类问题,请提交至 StackOverflow。
虽然以下内容似乎为实例参数化的 subgit 命令提供了 upstart 包装器(允许在服务器上运行多个存储库),但使用基于“实例”的作业使得自动启动/停止变得不切实际。相反,我已将存储库的启动命令添加到 /etc/rc.local(显示在底部)。
# subgit.conf - subgit job file
description "service for running SubGit mirroring"
author "Randy Sage"
# Note: because subgit forks too many times, normal upstart controls do not work
# Instead, use the method at https://stackoverflow.com/a/12217085/527489
# Run with subgit/gitshare ids, since we use shared gitshare access to repos
setuid subgit
setgid gitshare
instance $repo
pre-start exec subgit install $repo # actually start
script # dummy process tracking java app
while ps aux | grep "java.*$repo" | grep -v grep >/dev/null ; do
sleep 1
done
end script
post-stop script
if ps aux | grep "java.*$repo" | grep -v grep >/dev/null ; then
subgit shutdown $repo
fi
end script
以下是 /etc/rc.local 命令:
...
start subgit repo=/matlab.git
start subgit repo=/dev.git
exit 0
请注意,以这种方式启动的服务会出现在 下initctl list
,但不会出现service --status-all
:
rsage@subgit:~$ initctl list | grep subgit
subgit (/dev.git) start/running, process 2974
subgit (/matlab.git) start/running, process 2507