Ubuntu 为什么我的python脚本会在linux上静默停止?

Ubuntu 为什么我的python脚本会在linux上静默停止?,ubuntu,python-3.8,Ubuntu,Python 3.8,我正在使用Ubuntu20.04.2 LTS在linode服务器上运行python脚本(python 3.8.5)。它从Internet收集一些数据并将其写入SQLite数据库。我使用以下命令运行此进程: python3 -u my_script.py &>>logs.txt & 它运行了几个小时,然后在logs.txt文件中停止,没有任何错误。 它没有完成它应该做的事情(它应该运行约20个小时),当我在本地windows机器上运行它时,它也没有停止 我在这

我正在使用Ubuntu20.04.2 LTS在linode服务器上运行python脚本(python 3.8.5)。它从Internet收集一些数据并将其写入SQLite数据库。我使用以下命令运行此进程:

python3 -u my_script.py &>>logs.txt &    
它运行了几个小时,然后在logs.txt文件中停止,没有任何错误。 它没有完成它应该做的事情(它应该运行约20个小时),当我在本地windows机器上运行它时,它也没有停止

我在这里的几个主题中读到,它可能是“内存不足杀手”,扼杀了我的进程,但是:

1.我在/var/log/syslog中查找了它的信息,没有任何被杀死的信息。以下是在运行python脚本期间编写的系统日志:

Apr  9 17:15:01 localhost CRON[286303]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 17:17:02 localhost CRON[286349]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr  9 17:25:01 localhost CRON[286501]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 17:30:01 localhost CRON[286612]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Apr  9 17:32:45 localhost systemd[1]: Started Run anacron jobs.
Apr  9 17:32:45 localhost anacron[286672]: Anacron 2.3 started on 2021-04-09
Apr  9 17:32:45 localhost anacron[286672]: Normal exit (0 jobs run)
Apr  9 17:32:45 localhost systemd[1]: anacron.service: Succeeded.
Apr  9 17:35:01 localhost CRON[286737]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 17:45:01 localhost CRON[286959]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 17:52:13 localhost systemd[1]: session-1602.scope: Succeeded.
Apr  9 17:55:01 localhost CRON[287176]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 18:05:01 localhost CRON[287366]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 18:15:01 localhost CRON[287595]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 18:17:01 localhost CRON[287637]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Apr  9 18:25:01 localhost CRON[287835]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 18:30:01 localhost CRON[287972]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Apr  9 18:34:17 localhost systemd[1]: Started Run anacron jobs.
Apr  9 18:34:17 localhost anacron[288091]: Anacron 2.3 started on 2021-04-09
Apr  9 18:34:17 localhost anacron[288091]: Normal exit (0 jobs run)
Apr  9 18:34:17 localhost systemd[1]: anacron.service: Succeeded.
Apr  9 18:35:01 localhost CRON[288121]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Apr  9 18:45:01 localhost CRON[288403]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
  • 当我使用top命令监视内存使用情况时,脚本使用的内存永远不会超过四分之一
  • 请帮助我找出什么可能导致脚本停止。 以下是python脚本:

    import sqlite3
    import requests
    from bs4 import BeautifulSoup
    from multiprocessing.dummy import Pool as Threadpool
    from shutil import copyfile
    from datetime import datetime
    
    
    def get_ratings(object):
        url = object['url']
        try:
            response = requests.get(url)
            soup = BeautifulSoup(response.text, 'html.parser')
            object['factor1'] = soup.select_one('#factor1').attrs['content']
            object['factor2'] = soup.select_one('#factor2').attrs['content']
            object['factor3'] = soup.select_one('#factor3').attrs['content']
            for k, v in object.items():
                if v == 'no':
                    object[k] = False
                elif v == 'yes':
                    object[k] = True
        except Exception as e:
            print(e)
        return object
    
    counter = 0
    while True:
        counter += 1
        print(counter)
    
        con = sqlite3.connect('test.db')
        cur = con.cursor()
        cur.execute('SELECT id, url FROM projects WHERE factor1 IS NULL LIMIT 500')
        all_objects = [{'id': id, 'url': url} for id, url in cur.fetchall()]
        if len(all_objects) == 0:
            break
        print('Objects: ', len(all_objects))
        cur.close()
        con.close()
    
        thpool = Threadpool(4)
        results = thpool.map(get_ratings, all_objects)
    
        con = sqlite3.connect('test.db')
        cur = con.cursor()
        for object in results:
            try:
                cur.execute('UPDATE projects SET factor1=:factor1, factor2=:factor2, '
                            'factor3=:factor3 WHERE id=:id', object)
                con.commit()
            except Exception as e:
                print(e)
                continue
        cur.close()
        con.close()
    
        if counter % 50 == 0:
            day = datetime.utcnow().day
            hour = datetime.utcnow().hour
            minute = datetime.utcnow().minute
            copyfile('test.db', f'test_{hour}_{minute}_{day}.db')
    
    但它不会抛出任何错误(并且它会将收集到的所有数据正确插入数据库),我认为问题在于它运行的linode服务器。我是linux新手,不知道如何解决这个问题。我能找出进程停止了解其PID的原因吗

    另外,我在服务器上同时运行另一个python命令:

    python3 -m http.server 4747 &>/dev/null & 
    
    它能以某种方式导致脚本停止吗

    更新:
    我注意到,如果不关闭与服务器的SSH连接,脚本就可以正常工作,不会停止。但是,如果服务器始终处于打开状态,ssh连接的中断如何导致脚本停止?为什么脚本没有在关闭连接后立即失败,而是运行了一段时间?

    我最好的猜测是,在运行此脚本的过程中,您会在某个时候失去与服务器的连接,这会首先级联到cur.execute()返回none,cur.fetchall()返回空,并导致len(所有对象)==0返回true。然后,它会毫无错误地跳出while循环。尝试将con=sq3lite.connect('test.db')更改为

    这将导致使用特定权限打开数据库,如果数据库不存在,将导致以下错误

    sqlite3.OperationalError: unable to open database file
    

    另一种可能是cur.execute()调用不能按预期工作,并且在预期的结束条件之前,实际返回null作为某些查询。

    谢谢您的回复!但“如果数据库不存在”是什么意思?脚本总是连接到同一文件夹中的同一个db,是否可能在某个点上看不到,即使没有其他人使用该数据库?通过不关闭与服务器的ssh连接,我成功地完成了脚本,没有出现错误。是否注销ssh会话会导致脚本在一段时间后停止,即使linode服务器始终处于打开状态?这对我来说是有意义的。关闭SSH会话后,连接到服务器的尝试很可能会以静默方式失败。只要脚本运行,您就必须保持连接处于打开状态。如果你觉得答案有帮助,请投票并接受!
    sqlite3.OperationalError: unable to open database file