【问题标题】:Hung shell script when called from python从 python 调用时挂起的 shell 脚本
【发布时间】:2017-11-23 10:35:42
【问题描述】:

python pythontop.py # 挂在 test.sh 中。 cat of urandom 根本不会被截断

pythontop.py

import subprocess
subprocess.call(['test.sh'])

test.sh

RAND=`cat /dev/urandom | tr -dc 'a-zA-Z0-9'| fold -w 10 |  head -n 1`

编辑:人们对任何混淆表示歉意。事实证明,简单地从 python 本身调用 shell 脚本会导致脚本挂起。
更新: 更多更新。如果我在头前插入一个发球台。我收到一条损坏的管道消息。这意味着 head 完成了它的工作。有一条线并关闭了文件。
cat /dev/urandom | tr -dc 'a-zA-Z0-9'| fold -w 10 | tee | head -n 1
我看到脚本仍然挂起,即使在破管消息之后!
更新: 伙计们,我发现这很容易在 linuxcontainers.org 机器中重新创建。我这样做是为了让那些阅读这个问题的人可以通过他们自己的实验来证实这一观察结果。因为这似乎有点难以实现。 https://linuxcontainers.org/lxd/try-it/

【问题讨论】:

  • 为什么要从python 调用perl,而后者又调用sh 脚​​本?
  • 对我有用...pythontop.py 不会挂起(使用 python 2.7 和 perl 5.24)
  • 感谢您的回复。让我检查一下版本..
  • 卡在我无法修改的大型 perl 代码库中。正在编写一个快速的python代码来检查一些东西..以一种自动化的方式。现在,有人能告诉我对一个问题投反对票是什么意思吗?拒绝一个问题似乎很荒谬,除非它是多余的并且在整个互联网上都得到了回答。我总是可以更改生成随机文件名的方式,但我很好奇,出于可能的原因来到这里。
  • 我现在已经删除了中间的 perl 步骤.. 仍然为我挂起.. 但正如 xxfelixxx 指出的那样,他认为没有问题.. 让我试试他的版本

标签: python linux shell


【解决方案1】:

虽然您的代码在我的笔记本电脑上运行良好,但它似乎挂在容器化环境中,例如 linux containers

变化

subprocess.call(['test.sh'])

subprocess.call(['/bin/bash', 'test.sh'], shell=True)

停止脚本挂起。

subprocess documentation 建议不要对来自不受信任来源的任意未经处理的输入使用shell=True,因此您已收到警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 2012-06-04
    • 2013-09-28
    • 2016-04-08
    • 2011-11-18
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多