一半君的总结纸

听话只听一半君

在tomato路由器上用perp来监控shadowsocks daemon以避免假死现象?

shadowsocks客户端有时候会挂掉,想用perp这样的工具来让他能自动重启,还有些时候虽然ss运行着,但是上不了网. perp是用来监视某个daemon的,如果死了,就把他重启,一般会用在vm上,监控各种服务用.

lz使用的是v131版的tomato shibby的AIO版本,Asus rt-n66上运行ss客户端,此外在磊科q3上运行ss的服务器端,路由器运行的是v131的tomato shibby自己编译的Max版本,perp使用的是lz自己编译的版本,strip和upx过后总共309k左右

    1. 首先看看tomato用的是什么shell
      # echo $0
      -sh
      

      说明是bourne shell

    2. 然后把之前编译的shadowsocks/perp-2.07.tar.gz拷到路由器上
      scp shadowsocks/perp-2.07.tar.gz root@your-router:/jffs
      ssh root@your-router
      cd /jffs && mkdir perp
      tar -zxvf perp-2.07.tar.gz -C perp
      rm perp-*
      

因为不是电脑,tomato的目录都是启动时候临时生成的,所以perp-setup自动安装用不了,只能手动“安装“了
在/etc/profile里看到这一行

[ -f /jffs/etc/profile ] && . /jffs/etc/profile

意思是说,如果有/jffs/etc/profile,启动的时候就去运行他,这是在用户登陆之前就运行的

      1. 把perp路径加到PATH里
        vi /jffs/etc/profile
        内容如下

        export PATH=$PATH:/jffs/perp
        export PERP_BASE=/jffs/etc/perp
        
      2. 然后试试看对不对
        . /etc/profile
        
        # 验证下加好了没
        root@unknown:/jffs# set | grep perp
        PATH='/bin:/usr/bin:/sbin:/usr/sbin:/home/root:/mmc/sbin:/mmc/bin:/mmc/usr/sbin:/mmc/usr/bin:/opt/sbin:/opt/bin:/opt/usr/sbin:/opt/usr/bin::/jffs/perp'
        PERP_BASE='/jffs/etc/perp'
        
    1. 先配置perp自己
      现在如果直接运行perpboot是这样的

      root@unknown:/jffs# perpboot 
      perpboot fatal: failure chdir() to /jffs/etc/perp/.boot: file does not exist (ENOENT)
      

      下面新建perpd的配置文件:
      vi /jffs/etc/perp/.boot/rc.perp

      #!/bin/sh
      exec perpd -a 6 $PERP_BASE
      

      vi /jffs/etc/perp/.boot/rc.log

      #!/bin/sh
      LOGDIR=/var/log/perpd
      exec tinylog -k 8 -s 100000 -t ${LOGDIR}
      

      确保他们都是可执行的

      chmod +x /jffs/etc/perp/.boot/rc.log /jffs/etc/perp/.boot/rc.perp
      
      # 然后试试启动
      perpboot -d
      
      # 看看启动成功没
      root@unknown:/jffs# ps | grep perp
        713 root       712 S    perpboot -d
        715 root       720 S    tinylog -k 8 -s 100000 -t /var/log/perpd
        718 root       756 S    perpd -a 6 /jffs/etc/perp
      
      
    2. 下面配置shadowsocks server/client,举例用的是server
      mkdir -p /jffs/etc/perp/ss
      vi /jffs/etc/perp/ss/rc.main
      

      其内容是

      #!/bin/sh
      exec 2>&1
      if test ${1} = 'start' ; then              
         exec /jffs/ss/ss-server -c /jffs/ss/ss-server-config.json           
      fi              
      
      exit 0
      

      配置ss的log

      vi /jffs/etc/perp/ss/rc.log
      

      其内容是

      #!/bin/sh
      if test ${1} = 'start' ; then
         exec tinylog -k 5 -t /var/log/${2}
      fi
      
      exit 0
      

      确保他们都是可执行的

      chmod +x /jffs/etc/perp/ss/rc.main /jffs/etc/perp/ss/rc.log
      

      激活ss这个svc

      root@unknown:/jffs# perpctl A ss
      ss: set for activation
      rescan triggered for activation set on 1 service
      

      看看启动成功没,只要是一排加号,就说明对了

      root@unknown:/tmp/home/root# perpls
      [+ +++ +++]  ss  uptime: 38s/1087s  pids: 5388/607
      

      最后让perp自动启动,把如下内容加到 /jffs/etc/profile里

      if ! pidof perpd > /dev/null; then
         perpboot -d
      fi
      
    3. troubleshooting
      理论上现在已经达到,挂了就自动重启ss的效果了

      # 你的shadowsocks日志在 /var/log/ss/
      root@unknown:/tmp/home/root# tail -f /var/log/ss/current 
      19700101T001920.652558: 1970-01-01 01:19:20 INFO: initialize ciphers... aes-256-cfb
      19700101T001920.652615: 1970-01-01 01:19:20 INFO: listening at 0.0.0.0:8388
      
      # prepd的日志在 /var/log/perpd/
      root@unknown:/tmp/home/root# tail -f /var/log/perpd/current 
      19700101T001920.617414: perpd[606]: monitoring 1 client connection
      
      

综上同理你也可以用这个方法来监控shadowsocks的服务端

如下图所示,如果crash了,perp会帮你重开,gfycat屏幕录像看这里

如果有时候不知为什么连不上了,也可以去手动重启下ss,比如ssh进去后

# 先在路由器上试试
pidof ss-redir | xargs kill -9

# 如果你是ssh连过去,再关ss
ssh root@192.168.2.1 'pidof ss-redir | xargs kill -9'

这个可以放到电脑桌面上做个快捷方式,或者找个能先ssh然后运行脚本的apps放进去

edit: 不如放到cron里,比如每天下午6点关一下ss-redir,(perp会重启他)

cru a rebootSSEveryAfternoon "0 17 * * * pidof ss-redir | xargs kill -9"

上面这行放到webui的 Administration -> Scripts -> init里面即可,如果不想重启才生效,ssh上去然后运行一下即可

服务器段的tomato不是AIO版,没有xargs命令,用

cru a rebootSSEveryDay "0 17 * * * killall -9 ss-server ; /jffs/etc/config/ss-server.fire"

文件下载:
shadowsocks/perp-2.07.tar.gz

参考:
perp – persistent process supervision

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: