简体   繁体   English

Tmux,cron 不适用于我在谷歌云上的 python 脚本

[英]Tmux, cron doesn't work with my python script on google clouds

so i am trying to run my python script 24/7 using google cloud machine, I want to use tmux and cron but i think i am doing something wrong and it doesn't work for me.所以我试图使用谷歌云机器 24/7 运行我的 python 脚本,我想使用 tmux 和 cron,但我认为我做错了什么,它对我不起作用。 When i run my script in SSH window it works perfectly but when i close it.当我在 SSH 窗口中运行我的脚本时,它运行良好,但是当我关闭它时。 It doesn't post to twitter or edit my json file.它不会发布到 Twitter 或编辑我的 json 文件。

I tried looking for answer in google but no luck for me.我尝试在 google 中寻找答案,但对我来说没有运气。 I have tried using tmux and running my script with infinite loop and no lock.我曾尝试使用 tmux 并以无限循环且无锁的方式运行我的脚本。 I have tried using cron without infinite loop and run my script every 5 minutes and no luck.我尝试使用没有无限循环的 cron 并每 5 分钟运行一次我的脚本,但没有成功。 I have tried using cron inside tmux and no luck.我曾尝试在 tmux 中使用 cron,但没有成功。

import requests
import json
import time
import twitter

class TodayILearned():
    def __init__(self):
        self.link = 'https://www.reddit.com/r/todayilearned/new/.json'

    def get_info(self):
        try:
            r = requests.get(self.link, headers = {'User-agent': 'your bot 0.1'})
            r.raise_for_status()
        except requests.exceptions.HTTPError as error:
            print(f'There is problem:\n{error}')
            return False
        new_til = json.loads(r.content)
        new_til = new_til["data"]["children"][0]['data']['title']
        new_til = new_til.replace('TIL', '').replace('Til', '').strip()
        for _ in range(len(new_til) - 1):
            if new_til[0].isalpha() == False:
                new_til = new_til.replace(new_til[0], '').strip()#.capitalize()
            else:
                break
        new_til = new_til.split(' ', 1)
        if new_til[0].lower() == 'this' or new_til[0].lower() == 'that' or new_til[0].lower() == 'about' or new_til[0].lower() == 'of':
            new_til.pop(0)
        new_til = ' '.join(new_til)
        new_til = new_til[:1].upper() + new_til[1:]
        if new_til[-1].isalnum() == True:
            new_til += '.'
        return new_til if len(new_til) < 280 else False #change for 140 when twitter working 

    def save_new_dict(self, new_dict):
        with open('til_news_base.json', 'w') as json_file:
            json.dump(new_dict, json_file, indent=2)

    def read_json_file(self):
        with open('til_news_base.json') as json_file:
            data = json.load(json_file)
        self.last_key = int(sorted(list(data.keys()))[-1])
        return data

    def post_on_twitter(self, new_post):
        TOKEN = 'xxx'
        TOKEN_KEY = 'xxx'
        CON_SEC = 'xxx'
        CON_SEC_KEY = 'xx'
        my_auth = twitter.OAuth(TOKEN,TOKEN_KEY,CON_SEC,CON_SEC_KEY)
        twit = twitter.Twitter(auth=my_auth)
        twit.statuses.update(status=new_post)

    def program(self):
        wait_for_seconds = 30
        while True:
            #first load the base from file
            dict_with_news = self.read_json_file()
            #second get new posts from reddit
            new_info = self.get_info()
            #check if new post in base or if is it last post
            if new_info != False:
                if new_info != dict_with_news[str(self.last_key)]:
                    dict_with_news[str(self.last_key + 1)] = new_info
                    print(new_info)
            #add to base if not
                    self.save_new_dict(dict_with_news)
            #print new TIL on twitter
                    self.post_on_twitter(new_info)
            #wait Xs
            time.sleep(wait_for_seconds)


def program():
    class_til = TodayILearned()
    class_til.program()

if __name__ == "__main__":
    program()

I want it to run every 5 minutes but no luck, it doesn't post new stuff to twitter after i close SSH.我希望它每 5 分钟运行一次,但没有运气,在我关闭 SSH 后它不会向 Twitter 发布新内容。 after opening my SSH connection to google cloud i write: tmux, change directory to place where my python file and json file is.在打开与谷歌云的 SSH 连接后,我写道:tmux,将目录更改为我的 python 文件和 json 文件所在的位置。 i run my python script using python3.我使用 python3 运行我的 python 脚本。 I can see in console my new news and i can see it on twitter.我可以在控制台中看到我的新消息,也可以在 twitter 上看到。 I am waiting for 5 minutes and every time new stuff is posted on reddit i can see it in my console and posted on twitter.我等了 5 分钟,每次在 reddit 上发布新内容时,我都可以在控制台中看到它并发布在 twitter 上。 I close my SSH and there are no new posts on twitter or in json file.我关闭了我的 SSH,在 twitter 或 json 文件中没有新帖子。 I open SSH again and there are no errors or anything.我再次打开 SSH,没有错误或任何东西。 I tried also cron: i used command '*/5 * * * * python 3 /python_programs/watch_for_new_TIL_facts.py' without '' of course.我也尝试了 cron:我使用了命令 '*/5 * * * * python 3 /python_programs/watch_for_new_TIL_facts.py',当然没有 ''。 and still no luck.仍然没有运气。 I tried this command in cron in tmux and without it.我在 tmux 的 cron 中尝试了这个命令,没有它。 I have created stuff as normal user and as root.我以普通用户和 root 身份创建了东西。

In your crontab, you have a space between Python and 3 .在您的 crontab 中,您在Python3之间有一个空格。 Eliminate it.消除它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM