nohup 运行 Python flask,后台有 subprocess wait 可是不会进行操作

2022-10-10 16:01:43 +08:00
 yagamil

一个简单的 flask 下载页面,传入 url ,服务器下载。

部署 nohup python main.py &

    cmd = 'wget {} -O /home/opc/video/{}'

    command = cmd.format(link, filename)
    try:
        p = subprocess.Popen(command.split(), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    except Exception as e:
        return False
    else:
        p.wait()
        print(p.stdout.read().decode())
        return True
        

现象: 期待: 调用 wget 下载,等下载完了才会返回 ret 给前端页面。 因为有 p.wait()

如果不用 nuhup 放在后台,的确是这样,会等待下载结束后才 返回给前端。

可是用了 nohup 之后,下载进程没有进行,直接就返回了,没看到任何报错。

请问有 v 友知道的吗?

2298 次点击
所在节点    Python
17 条回复
yagamil
2022-10-10 16:23:48 +08:00
找到问题了:

subprocess.Popen(command.split(), shell=True,

这里的 shell 应该为 False
jiangpranay
2022-10-10 16:37:53 +08:00
shell true , false 的意义是?
julyclyde
2022-10-10 17:04:21 +08:00
@jiangpranay nohup 是个 shell 内部命令

但是

@yagamil 你为什么要用 nohup 呢
SmallXeon
2022-10-10 17:36:20 +08:00
subprocess 里头,如果 cmd.split 了就不要 shell=True 了。

个人经验上给 subprocess 传入 cmd.split 是用来确保参数安全不被命令注入用的。
而在要确保 cmd 的完整执行的场景时(例如包含管道或多条命令拼接时),就不要 cmd.split ,并且传入 shell=True 。
tfdetang
2022-10-10 17:39:23 +08:00
是啊,为什么要用 shell 命令来解决这个问题呢?
webcape233
2022-10-10 19:28:09 +08:00
你可以用 py 的下载库啊 ,那怕是 curl ,也有的吧
wxf666
2022-10-10 19:28:23 +08:00
为嘛不能用 request 、aiohttp 等库,在 Python 里下载呢?
ch2
2022-10-10 20:12:12 +08:00
有没有一种可能,wget 是一个 python 的包
blankmiss
2022-10-10 20:24:39 +08:00
@ch2 他这明显是发送 shell 命令 而且 wget 公认不是 linux 包下载工具吗(虽然也有其他系统版本)
zmaplex
2022-10-10 20:29:50 +08:00
我觉得用 wget 挺好的,不用处理异常失败重试添加参数就好了,不用写额外的代码。
hsfzxjy
2022-10-10 20:44:03 +08:00
有可能你 url 里有&字符,被 shell 错误解析了
ch2
2022-10-10 21:21:31 +08:00
@blankmiss #9 这玩意功能很单一,是跨平台的无误
lambdaq
2022-10-10 21:43:10 +08:00
@hsfzxjy 正解哈哈哈。。
julyclyde
2022-10-11 08:47:33 +08:00
@hsfzxjy
……
当年我就因为这事搞出过事故。唉~
yagamil
2022-10-12 10:54:41 +08:00
@julyclyde 但是想着反正后台。其实也有个 -d 的参数 可以后台运行
yagamil
2022-10-12 10:55:22 +08:00
@wxf666 程序还有一部分使用 you-get 下载的,可以下载油罐视频,这里隐去了
julyclyde
2022-10-12 12:43:29 +08:00
@yagamil nohup 和后台其实没有任何关系啊
你要说&符号可能还有点关系,虽然也不严谨

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885816

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX