在项目里用到 saltstack 来管理哑节点,开启的 proxy 不定时就会不响应 RPC 命令,只能写一个定时重启脚本,脚本就很简单了:
杀掉已有的 proxy 进程再开启新的。
但是定时执行以前没有接触过,感觉很有意思。需要修改的文件位于 /etc/crontab
:
最后一行:
每分钟 9-22 点 天 周 月 root 用户 脚本路径
- 8 更新:
脚本执行几天后,发现了一个问题,即在使用 grep
命令时也开启了一个进程,这个进程的 PID 可能排在 proxy 的 PID 之前,在杀掉进程的时候取的是匹配到的第一项,那么就有可能杀掉的是 grep 的进程,而不是 proxy 的,从而造成不仅没能杀掉旧的,还开启了更多新的,造成重复,如图:
grep 的进程排在 proxy 的进程之前,后面的进程无法被 kill
解决的方法是,按照运行时间顺序显示进程,然后提取最后一行(也就是最早开启的进程)的 PID:
这下应该就没有问题了~
- 8 更新:
如果是要把 .py 文件添加定时任务的话,crontab 这样写:
# python安装路径 .py文件路径 标准输出和错误重定向到文件
*/1 8-23 * * * root /usr/bin/python /usr/local/bin/delBadNodes.py > /tmp/load.log 2>&1 &
python 的安装路径可以用这个命令查看:
# which python
/usr/bin/python
附 Python 脚本:
import subprocess
p = subprocess.Popen('salt "*" test.ping', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
out, err = p.communicate()
line = out.splitlines()
count = 0
for l in line:
if count % 2 == 0:
lastline = l
else:
if l.strip() != "True":
q = subprocess.Popen("salt-key -d " + lastline.rstrip(":") + " -y", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
count += 1