linux - 如何查看python脚本自动退出原因?
迷茫
迷茫 2017-04-18 10:06:12
0
4
1223

使用gunicorn+flask框架,同时通过apscheduler实现对一款爬虫的定时调用,但是在这其中遇到了一个问题,如下:
1,我利用shell终端,通过gunicorn -c直接运行,然后通过flask构造url调用爬虫,并在终端观察输出信息,可以完美调用爬虫。但是当我运行gunicorn -c之后,关闭终端,则爬虫不能完美运行,通过对爬虫调试,发现在运行一段时间后就被终止。
2,之后我在爬虫中使用os.system('nohup python spider.py &'),并且一直打开终端可以完美运行,但是在关闭终端的情况下,又无法执行到底。
所以请问大家怎么来看一下这个脚本运行中为何自动结束。或者说产生的原因是什么。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(4)
左手右手慢动作

Votre processus n'a pas quitté le terminal. Une fois le terminal fermé, tous les processus enfants associés au terminal seront terminés sans aucune sortie.
Il est recommandé de faire de spaider.py un processus démon, hors du contrôle du terminal.

阿神

journalisation

大家讲道理

Merci pour vos réponses. La vraie raison a été trouvée. C'est parce que trop de sorties d'impression pendant le processus de débogage dépassent le cache et entraînent la fin du processus.

小葫芦

Bien que vous exécutiez le processus en arrière-plan, il n'est pas détaché du terminal qui a démarré le processus. Par conséquent, le terminal shell du processus parent est fermé et le processus enfant sera également fermé.

Solution 1, vous pouvez vous référer à Comment faire fonctionner un script Python comme un service ou un démon sous Linux, qui vous apprend à programmer un processus en processus démon sous Linux. L’exemple de programme est assez long, je l’expliquerai donc à la fin.

Solution 2, il existe des bibliothèques python qui peuvent démoniser leurs propres processus, et il y en a pas mal. Par exemple, python-démon. Les exemples d'utilisation sont les suivants :

import daemon

def do_main_program():
    pass  # 你的程序

with daemon.DaemonContext():
    do_main_program()
    

Traitement supplémentaire de la solution 1 :

# -*- coding: utf-8 -*-
import os
import sys
import datetime

def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)  # Exit first parent.
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
        sys.exit(1)
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid()
    # Do second fork.
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)  # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
        sys.exit(1)
    # Redirect standard file descriptors.
    si = file(stdin, 'r')
    so = file(stdout, 'a+')
    se = file(stderr, 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())
    
if __name__ == "__main__":
    daemonize()
    # 然后开始执行你的其他程序。
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal