T00ls 签到程序监控脚本

Posted by JenI on 2017-02-08 00:00:00+08:00

前言

最近堕落的不行,一直懒得写博客,打着学逆向的幌子往椅子上一摊,假模假样的看汇编视频,结果新东西没学多少,之前会的东西倒是忘的挺多。年也过完了,新年新气象,再懒下去也不是事,多少写点东西吧。

最近有同学跟我反映说上一篇文章写的那个 T00ls 签到脚本有问题,放服务器上跑几天自己就停了。我虽然没遇到,但是既然有人遇到了,还是应该想个解决办法,毕竟签到这个事是要求连续的,断一天之前的努力就白费了。

正文

我服务器上的脚本没出现过这种情况,就算出现了日志文件里也不一定有该脚本进程结束的记录,所以这里也没办法分析脚本进程意外消失的原因。没办法,只能采取一个更加直接且有效的办法,就是再写一个监控脚本,用来监控签到脚本的进程,只要发现签到进程消失,就重新启动一个签到进程,这样签到就不会意外中断了。

这里有一个小问题,就是重新启动的签到进程并不持有微信的登录状态,这怎么办?没关系,itchat 库里的 auto_login 方法 提供了一个 hotReload 属性用于短时间关闭程序后重连,这样即使程序关闭,一定时间内重新开启也可以不用重新扫码。设置方法很简单,只需要使 hotReload 值为真就可以了

itchat.auto_login(hotReload=True)

这样签到脚本就变为

# -*- coding=utf-8 -*-

import time
import itchat
import threading

def sign():
    today = int(time.strftime('%y%m%d', time.localtime(time.time())))
    while True:
        if today == int(time.strftime('%y%m%d', time.localtime(time.time()))):
            time.sleep(600)
        else:
            itchat.send(msg='3',toUserName='T00lsNet')
            time.sleep(3)
            itchat.send(msg='4',toUserName='T00lsNet')
            today = int(time.strftime('%y%m%d', time.localtime(time.time())))

itchat.auto_login(enableCmdQR=True,hotReload=True)
t = threading.Thread(target=sign)
t.setDaemon(True)
t.start()
itchat.run()

然后我们写个shell脚本用来监控签到脚本。身为监控脚本,自己首先不能停,所以先来个无限循环

while :
  do
    # something
  done

通过 ps -ef 命令查看签到脚本进程是否存在,这里需要注意,再使用 grep 命令时需要使用 -v 参数将 grep 自己产生的结果去掉,不然查询结果中会一直有一个带有 sign 字符的进程

ps -ef |grep "sign.py" |grep -v "grep"

这样如果签到进程存在会返回该进程的详细信息,如果不存在则无返回结果。之后再通过简单的条件判断语句对签到进程进行监控。整体代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
while :
  do
    SignExist=$(ps -ef |grep "sign.py" |grep -v "grep")
      if [ "$SignExist" ] ; then
        continue
      else
        python sign.py &
      fi
        sleep 10
  done

监控脚本每隔十秒检测一次签到进程是否存在,一旦签到进程消失便立刻重新启动一个新的签到进程。

将监控脚本保存,并赋予执行权限

chmod +x monitor.sh

然后修改start.sh文件,将内容改为

./monitor.sh &

执行签到脚本,扫码登录后执行监控脚本

python sign.py &
# 扫码登录
# 执行监控脚本
./start.sh

监控脚本效果如下:

# 此时 sign 脚本进程 pid 为 14046,
[root@jenisec ~]# ps -ef |grep "sign" |grep -v "grep" && ps -ef | grep "monitor" |grep -v "grep"
root     14046     1  0 Feb10 ?        00:00:37 python sign.py
root     24322     1  1 Feb10 ?        00:10:23 /bin/bash ./monitor.sh

# 使用 kill 命令杀掉该进程
[root@jenisec ~]# kill 14046

# 再次查询发现监控脚本重新启动了签到进程,进程 pid 为 28477
[root@jenisec ~]# ps -ef |grep "sign" |grep -v "grep" && ps -ef | grep "monitor" |grep -v "grep"
root     28477 24322  3 00:56 ?        00:00:00 python sign.py
root     24322     1  1 Feb10 ?        00:10:24 /bin/bash ./monitor.sh

总结

Linux 的 shell 编程在系统管理等领域起着不可忽视的作用,了解一点 shell 编程,也是很有必要的。


作者:   JenI   转载请注明出处,谢谢


Comments !