Crontab正在运行同一个.py的多个实例

时间:2016-11-30 09:00:58

标签: python linux crontab

我正在使用Twitter自动转发机器人,有时20分钟后机器人停止,有时它不会停止。要解决此问题,我使用crontab每20分钟重新运行一次程序。

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

但问题是如果僵尸程序没有在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)

2 个答案:

答案 0 :(得分:1)

Cron不是正确的工具。有很多系统监视进程以确保它仍处于运行状态,如果没有,则重新启动它 - 包括supervisor,systemd,monit和upstart。任何这些都会更合适。

答案 1 :(得分: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