前言
最近堕落的不行,一直懒得写博客,打着学逆向的幌子往椅子上一摊,假模假样的看汇编视频,结果新东西没学多少,之前会的东西倒是忘的挺多。年也过完了,新年新气象,再懒下去也不是事,多少写点东西吧。
最近有同学跟我反映说上一篇文章写的那个 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 !