2016-11-30 61 views
-2

的多个实例,我使用了Twitter自动转推机器人,有时20分钟后,机器人停止,有时它不会停止。为了解决这个问题,我使用crontab每20分钟重新运行程序。crontab的运行相同的.py

*/20 * * * * /home/TwitterFollowBot/bot.py 2>/tmp/twitterBot.log 

但问题是如果bot在20分钟内没有停止运行2X,因为crontab还会每20分钟启动另一个实例。如果机器人不停止,这将继续发生。有时它运行10X,这意味着它的转发量超过了限制。所以我需要做的是每19分钟杀死所有/这个bot.py,并在20分钟时间内运行一个新的bot.py。

bot.py

#!/usr/bin/env python 

from TwitterFollowBot import TwitterBot 
my_bot = TwitterBot("/home/TwitterFollowBot/config.txt") 
my_bot.sync_follows() 
my_bot.auto_rt("@SupStreamers", count=2200) 
my_bot.auto_rt("@#SupportSmallStreamers", count=2200) 
my_bot.auto_rt("@Small_Streamers", count=2200) 
+0

如何保持一个锁定文件,告诉脚本是否正在运行? – fedorqui

+0

这似乎是一个经典的[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。为什么你不试图弄清楚如何在崩溃之前杀死你的机器人,试图弄清为什么它有时会在20分钟后崩溃?对于SO来说,这将是更明智的*和更适合的问题。 – Phillip

+0

你认为这会解决我的问题吗?如果ti停止?我必须手动运行它吗?这意味着我必须每20分钟检查一次VPS。如我错了请纠正我。 –

回答

1

cron是不是这里的合适的工具。有很多系统监视进程以确保它仍然运行,如果没有,则重新启动 - 这些系统包括supervisor,systemd,monit和upstart。其中任何一种都会更合适。

+0

哪一个是最容易使用的?因为我有一个非常基础的知识。 –

0

你把一个控制器在你的脚本,其内容是什么Python脚本是当前活动的开始。如果相同的脚本已经在运行,则告诉脚本不执行任何操作。

我使用正则表达式,你可以使用任何你想要的,如果你不喜欢的正则表达式。

import os, commands, subprocess, re 

def find(pat, string): 
    match = re.search(pat, string) # find function for searches below 
    if match: 
     return match.group() 
    else: 
     return None 

allProcessIDs = os.popen('pgrep -lf python').read() 
sameProcessID = find('\d{7} python YourApplicationName.py', allProcessIDs) 
if sameProcessID: 
    raise Systemexit 
+0

非常感谢你!所以我需要做的就是复制并粘贴python的这段代码?我需要把上面的“#!/ usr/bin/env python”还是在这下面? –

+0

我得到这个错误 root @ ip - **************:/ home/TwitterFollowBot#python bot.py 文件“bot.py”,第24行 ^ SyntaxError:无效的语法 –

+0

你把它放在你的正常代码之前的shebang下面。这是我在生产中使用的代码中的一个单元。如果你有一些问题pastebin你的代码和你实现它的地方。另外请注意,我使用制表符而不是空格。 PEP8 hah .. –