【问题标题】:subprocess.call nohup & - doesn't run process in backgroundsubprocess.call nohup & - 不在后台运行进程
【发布时间】:2020-12-20 13:29:39
【问题描述】:

我有一个运行 Scrapy 蜘蛛的函数(Django 管理员)。该功能正常工作。我现在要做的就是让它成为非阻塞的。

这按预期工作 - 我需要等待 SH SCRIPT 完成。所以基本上我点击这个动作,浏览器正在等待抓取结束。

subprocess.call([settings.CRAWL_SH_ABS_PATH, "db_profiles_spider", "ids", ids])

我希望它是非阻塞的,以便浏览器立即刷新。

我试过了:

subprocess.call(["nohup",settings.CRAWL_SH_ABS_PATH, "db_profiles_spider", "ids", ids, '&'])

但它似乎被阻止并且浏览器等待响应。为什么?我怎样才能让它发挥作用?

【问题讨论】:

    标签: python django bash scrapy subprocess


    【解决方案1】:

    & 用于 shell,所以试试这样:

    cmd = ' '.join(["nohup", settings.CRAWL_SH_ABS_PATH, "db_profiles_spider",
                    "ids", ids, '&'])
    subprocess.call(cmd, shell=True)
    

    更新:

    对我来说,不使用 nohup 也可以。

    您还可以创建一个线程并在该线程中运行命令。也可以os.fork(),在子进程中运行命令。

    【讨论】:

    • 刚刚试过,subprocess.call([...], shell=True) 不起作用。命令需要是一个字符串。
    • 据我了解,nohup 可确保继续收集后台进程的输出,即使父进程不再存在。
    • 当涉及 pty 时更有意义,因此该进程将不受 SIGHUP 的影响。
    • 例如,根据 bash 手册,“shell 在收到 SIGHUP 后默认退出。在退出之前,交互式 shell 会将 SIGHUP 重新发送给所有正在运行或停止的作业。停止的作业会发送 SIGCONT以确保他们收到 SIGHUP。”你可以这样尝试:使用 putty ssh 到服务器(假设远程 shell 是 bash)并运行 sleep 9999 &,然后强制关闭 putty 窗口。 bash 将接收 SIGHUP 并将 SIGHUP 发送到 sleep 进程,并且 sleep 将被终止。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多