cari

Rumah  >  Soal Jawab  >  teks badan

linux - 如何查看python脚本自动退出原因?

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

迷茫迷茫2804 hari yang lalu1214

membalas semua(4)saya akan balas

  • ringa_lee

    ringa_lee2017-04-18 10:08:12

    Proses anda belum keluar dari terminal Selepas terminal ditutup, semua proses anak yang dikaitkan dengan terminal akan ditamatkan tanpa sebarang output.
    Adalah disyorkan untuk menjadikan spaider.py menjadi proses daemon, di luar kawalan terminal.

    balas
    0
  • 阿神

    阿神2017-04-18 10:08:12

    log masuk

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:08:12

    Terima kasih atas jawapan anda Alasan sebenar telah ditemui Ini kerana terlalu banyak output cetakan semasa proses penyahpepijatan melebihi cache dan menyebabkan proses tamat.

    balas
    0
  • 高洛峰

    高洛峰2017-04-18 10:08:12

    Walaupun anda melaksanakan proses di latar belakang, ia tidak terlepas daripada terminal yang memulakan proses Oleh itu, terminal shell proses induk ditutup dan proses anak juga akan ditutup.

    Penyelesaian 1, anda boleh merujuk kepada Cara membuat skrip Python berjalan seperti perkhidmatan atau daemon dalam Linux, yang mengajar anda cara memprogramkan proses menjadi proses daemon di bawah Linux. Program sampel agak panjang, jadi saya akan menerangkannya di penghujung.

    Penyelesaian 2, terdapat perpustakaan ular sawa yang boleh membuat daemonisasi proses mereka sendiri, dan terdapat beberapa. Contohnya, python-daemon. Contoh penggunaan adalah seperti berikut:

    import daemon
    
    def do_main_program():
        pass  # 你的程序
    
    with daemon.DaemonContext():
        do_main_program()
        

    Pemprosesan penyelesaian tambahan 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()
        # 然后开始执行你的其他程序。

    balas
    0
  • Batalbalas