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

2022 年 10 月 10 日
 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 友知道的吗?

3127 次点击
所在节点    Python
17 条回复
yagamil
2022 年 10 月 10 日
找到问题了:

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

这里的 shell 应该为 False
jiangpranay
2022 年 10 月 10 日
shell true , false 的意义是?
julyclyde
2022 年 10 月 10 日
@jiangpranay nohup 是个 shell 内部命令

但是

@yagamil 你为什么要用 nohup 呢
SmallXeon
2022 年 10 月 10 日
subprocess 里头,如果 cmd.split 了就不要 shell=True 了。

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

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

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

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

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

© 2021 V2EX