【问题标题】:Will shell scripts called from python persist after the python script ends?在 python 脚本结束后,从 python 调用的 shell 脚本会持续存在吗?
【发布时间】:2011-01-15 11:28:47
【问题描述】:

作为自动化测试的一部分,我有一个 python 脚本,它需要调用两个 shell 脚本,这些脚本启动两个不同的服务器,这两个服务器需要在调用脚本结束后进行交互。 (它实际上是一个 jython 脚本,但目前我不确定这是否重要。)我可以做些什么来确保服务器在 python 脚本结束后保持正常运行?

此时它们被称为:

def runcmd(str, sleep):
    debug('Inside runcmd, executing: ' + str)
    os.chdir("/new/dir/")
    directory = os.getcwd()
    print 'current dir: '+ directory
    os.system(str)

t = threading.Thread(
        target=runcmd,
        args=( cmd, 50,)
    )

【问题讨论】:

  • 语义上,线程的生命直接依赖于它的所有者的生命。所以我真的希望线程随着python而死。不过,我不确定这也是“一般 python”的真相。
  • 你的shell脚本是什么?它们是守护进程的启动脚本,还是 shell 脚本本身就是您所指的服务器?

标签: python automation jython sh


【解决方案1】:

Python 线程都会随着 Python 而死。此外, os.system 正在阻塞。但这没关系——如果 os.system() 运行的命令启动一个新进程(但不是子进程),一切都会好起来的。例如,在 Windows 上,如果命令以“start”开头,则“start”进程将在 Python 死亡后保留。

编辑:nohup 相当于 Linux 上的 start。 (感谢 S. Lott)。

【讨论】:

  • 对于 unix,您可以使用显式的nohup 来创建一个将持续存在的进程。
【解决方案2】:

os.system() 在它启动的进程结束之前不会返回。如果您希望在单独的进程中使用 subprocessRuntime.exec()

【讨论】:

    【解决方案3】:

    我想知道使用 subprocess.Popen 是否更适合您。

    也许做一些类似于 shell=True 的事情

    【讨论】:

      【解决方案4】:

      线程无法工作,因为它们是进程的一部分。 system 调用不起作用,因为它会在您的新进程执行时阻塞。

      您将需要使用os.fork() 之类的东西来生成一个新进程并在新进程中执行它。看看subprocess,了解一些好的食谱风格解决方案。

      【讨论】:

        【解决方案5】:

        通常,要启动独立于其父级的长时间运行的服务器,您需要对其进行守护程序。根据您的环境,有各种包装器可以帮助完成此过程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-17
          • 2018-03-25
          • 2020-10-02
          • 1970-01-01
          • 2021-10-19
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          相关资源
          最近更新 更多