为了账号安全,请及时绑定邮箱和手机立即绑定

从python运行程序,并在脚本被杀死后继续运行

从python运行程序,并在脚本被杀死后继续运行

慕侠2389804 2019-10-17 15:45:44
我试过运行这样的事情:subprocess.Popen(['nohup', 'my_command'],                 stdout=open('/dev/null', 'w'),                 stderr=open('logfile.log', 'a'))如果父脚本正常退出,则此方法有效,但是如果我终止了该脚本(Ctrl-C),我的所有子进程也将全部终止。有办法避免这种情况吗?我关心的平台是使用Python 2.6 和 Python 2.7的OS X和Linux 。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

在Unix系统上,执行此操作的通常方法是分叉并退出(如果您是父母)。看一看os.fork()。


这是完成任务的函数:


def spawnDaemon(func):

    # do the UNIX double-fork magic, see Stevens' "Advanced 

    # Programming in the UNIX Environment" for details (ISBN 0201563177)

    try: 

        pid = os.fork() 

        if pid > 0:

            # parent process, return and keep running

            return

    except OSError, e:

        print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) 

        sys.exit(1)


    os.setsid()


    # do second fork

    try: 

        pid = os.fork() 

        if pid > 0:

            # exit from second parent

            sys.exit(0) 

    except OSError, e: 

        print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) 

        sys.exit(1)


    # do stuff

    func()


    # all done

    os._exit(os.EX_OK)


查看完整回答
反对 回复 2019-10-17
?
DIEA

TA贡献1820条经验 获得超2个赞

子进程收到与父进程相同的SIGINT,因为它在同一进程组中。您可以通过在子进程中调用os.setpgrp()将该子进程放入其自己的进程组。Popen的preexec_fn参数在这里很有用:


subprocess.Popen(['nohup', 'my_command'],

                 stdout=open('/dev/null', 'w'),

                 stderr=open('logfile.log', 'a'),

                 preexec_fn=os.setpgrp

                 )

(preexec_fn仅适用于un *x-oid。Windows似乎与“ creationflags = CREATE_NEW_PROCESS_GROUP”大致等效,但我从未尝试过。)


查看完整回答
反对 回复 2019-10-17
  • 2 回答
  • 0 关注
  • 702 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信