跳到正文
网络寻租
返回

进程监控遇到的麻烦事

此为技术死磕贴,非技术人士请跳过。

明天回家,为了能够让我在家里面连到公司的网络,以及让公司留下来的人能够使用到翻墙服务,我需要把几个脚本监控起来。 这样不管这些脚本跑挂了,还是机器重启了,还是网络断掉又重新连起来了,这些进程都能够在状况恢复的时候立刻起来。

需要跑的脚本其实很简单,ssh翻墙,以及ssh链接到服务器上面一个端口用作外网访问内网。都用一行脚本搞定:

autossh -M 2121 -D 10.78.78.105:7070 linjunhalida.com -N -p 2201  -zZ OOO
autossh -M 2132 linjunhalida.com -N -p 2200 -zZ OOO -R 6333:localhost:22

为了能够让ssh自动重连,我采用了autossh。 因为我的ssh是打过混淆包头补丁的, 加了一个参数(-zZ),autossh我也修改了一下源码支持这个参数。

我的服务器是ubuntu,我还需要用一个工具来监控autossh,需要能够机器启动的时候执行它,以及它挂掉的时候自动起来。

然后请教了各个网站的友邻,这里列一下大家给出来的办法:

最后我考量到学习成本,还是采用了god加/etc/init.d启动脚本的解决方案。

god脚本:

god_path = File.expand_path(File.dirname(__FILE__))

God.watch do |w|
  w.name = "gfw"
  w.uid = 'halida'

  w.dir = "/home/halida/workspace/sources/autossh"
  w.env = {"AUTOSSH_PATH" => "/home/halida/Dropbox/sync/bin/ssh"}
  w.start = "./autossh -M 2121 -D 10.78.78.105:7070 linjunhalida.com -N -p 2201  -zZ OOO"
  w.log = File.join god_path, "log/gfw.log"
  w.keepalive
end

God.watch do |w|
  w.name = "bypass"
  w.uid = 'halida'

  w.dir = "/home/halida/workspace/sources/autossh"
  w.env = {"AUTOSSH_PATH" => "/home/halida/Dropbox/sync/bin/ssh"}
  w.start = "./autossh -M 2132 linjunhalida.com -N -p 2200 -zZ OOO -R 6333:localhost:22"
  w.log = File.join god_path, "log/bypass.log"
  w.keepalive
end

当前用户跑起来没有问题,但是god本身是需要设置成service跑起来的。 还好我找到了别人分享的把god当做service的办法, 丢到/etc/init.d里面的脚本如下(拷贝自这里):

#!/bin/bash
 
### BEGIN INIT INFO
# Provides:             god
# Required-Start:       $all
# Required-Stop:        $all
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    God
### END INIT INFO
 
NAME=god
DESC=god
GOD_BIN=/usr/local/bin/god
UHOME=/home/halida
GOD_CONFIG=$UHOME/workspace/god/god.rb
GOD_LOG=$UHOME/workspace/god/log/god.log
GOD_PID=/var/run/god.pid
 
set -e
 
# Make sure the binary and the config file are present before proceeding
if ! test -x $GOD_BIN; then
  echo "Config file not found at ${GOD_BIN}"
  exit 0
fi
 
# Create this file and put in a variable called GOD_CONFIG, pointing to
# your God configuration file
if ! test -f $GOD_CONFIG; then
  echo "Config file not found at ${GOD_CONFIG}"
  exit 0
fi
 
RETVAL=0
 

case "$1" in
  start)
    echo -n "Starting $DESC: "
    $GOD_BIN -c $GOD_CONFIG -l $GOD_LOG -P $GOD_PID
    RETVAL=$?
    echo "$NAME."
    ;;
  stop)
    echo -n "Stopping $DESC: "
    $GOD_BIN quit
    RETVAL=$?
    echo "$NAME."
    ;;
  terminate)
    echo -n "Stopping $DESC and all tasks: "
    $GOD_BIN terminate
    RETVAL=$?
    echo "$NAME."
    ;;
  restart)
    echo -n "Restarting $DESC: "
    $GOD_BIN quit
    $GOD_BIN -c $GOD_CONFIG -l $GOD_LOG -P $GOD_PID
    RETVAL=$?
    echo "$NAME."
    ;;
  status)
    $GOD_BIN status
    RETVAL=$?
    ;;
  *)
    echo "Usage: god {start|stop|terminate|restart|status}"
    exit 1
    ;;
esac

exit $RETVAL

然后设置启动执行这个服务:

sudo update-rc.d god default

跑god的时候遇到了问题,这个时候我浪费了非常多的时间。问题在于我的god是采用rvm以及非root用户安装的。环境不对。各种报错。

然后我各种尝试,还打算丢掉god,采用其他的方式来跑脚本,但是都可耻地失败了。

最后第二天我想到了办法,系统安装god:

sudo gem install god

重启之后验证成功。

结论

最后我的解决方案就是:god as a service,监控autossh。log都丢掉god目录下面。

总结一下经验:

以上。


分享这篇文章:

上一篇
从零开始学编程
下一篇
关于宗教信仰

评论

评论通过 GitHub 账号发布,需要先使用 GitHub 登录。