【问题标题】:How to kill a terminal after completion of process进程完成后如何杀死终端
【发布时间】:2013-06-01 10:34:41
【问题描述】:

我正在为我的项目学习 bash 脚本和 python,我想在其执行完成后终止终端。 我在一个终端上运行我的进程,当我执行它时,它会打开一个新终端并执行请求的操作,然后在完成后必须关闭新终端,这不会发生。 我的代码是:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 

当我运行它时,它将打开新终端并在其中执行,执行后“pwd”是

ubuntu:-/home/new$

无法向那里发送任何命令。
完成后我想杀死终端,因为下次执行我想打开新终端。

我试过了,效果很好,但不知道如何在 python 脚本中添加:

a=`tty`    
echo $a   
b=`tty | sed 's/\/dev//'`  
echo $b  
c=`ps aux | grep $a | grep 'bash$' | awk '{print $2}'`  
echo $c  
d= `$c | awk '{print $1}'   
kill -9 $d  

寻找建议,请指导我获得解决方案。 提前致谢。

【问题讨论】:

  • 你为什么要打开一个新的终端?
  • 不清楚“无法向那里发送任何命令”是什么意思。你想在终端中输入命令吗?然后看我的回答。如果你想从 Python 向终端中的 shell 发送命令,那么你需要更多。
  • 您能根据期望的结果描述您想要做什么吗?我认为您正在寻找您不需要的问题的解决方案。
  • @ThomasFenzl: testing.sh 进行 svn 更新,然后进行系统构建,然后创建 deb。

标签: python bash shell ubuntu


【解决方案1】:

让我们备份并仔细查看您发布的主要代码行:

os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'")

它有什么作用?

  • 它使用 Python 调用 shell (os.system),这通常不是一个好主意,原因有很多。
  • 在该 shell 中,它启动 xfce4-terminal。
  • 在 xfce4-terminal 内部,它运行 bash。可能 xfce4-terminal 在另一个 bash 中运行这个 bash。
  • 在这个新的 bash 中,它运行 testing.sh。
  • 最后,由于我不清楚的原因,它运行了另一个 bash。

流程层次结构是什么样的?

shell (whichever you use to launch this thing, likely bash)
    python
        shell (the system default, possibly bash)
            xfce4-terminal
                bash (replaced by another bash at the end, "exec bash")
                    bash
                        testing.sh

你知道这看起来有多疯狂吗?想想你真正想要完成的事情。它可能看起来更像这样:

shell
    python
        testing.sh

怎么做?

import subprocess
subprocess.check_call(['./testing.sh'])

如果你真的需要启动 xfce4 终端:

subprocess.check_call(['xfce4-terminal', '-e', './testing.sh'])

【讨论】:

  • 我想他想预加载环境,然后得到一个交互式shell。是的,流程树很疯狂,但如果没有更清晰的意图或 testing.sh 做了什么,很难知道。
  • @John Zwinck:我之前试过,但它只是打开一个终端然后突然关闭..所以我尝试了这个。
  • 现在你说它“突然关闭”,但在你原来的问题中,你抱怨终端没有在你想要的时候关闭。我认为我们需要您从上到下非常非常清楚地解释您在这里试图实现的实际目标。否则,这将是更多的创可贴。
  • @JohnZwinck:当我尝试使用您的解决方案时,它会弹出终端,然后在几分之一秒内关闭。
  • 请注意,最后一次调用不是“运行另一个 bash”,而是 exec base,所以它替换 bash 为 -c 选项跨度>
【解决方案2】:

终端在其最后一个子进程退出时关闭。这会做我认为你想要的:

os.system("xfce4-terminal -e 'bash -c \"echo hello ; /bin/bash ; exit 0\"'")

我测试过的。

为回应评论而添加

在 Ubuntu /usr/bin/usb-devices 中有一个 shell 脚本,它打印到标准输出然后退出。如果我运行 Python

os.system("xfce4-terminal -e /usr/bin/usb-devices")

然后出现一个终端,显示脚本的输出,然后终端退出。真的没有比这更简单的了。

【讨论】:

  • 您正在退出最后一个 /bin/bash,而不是终端。
  • @ThomasFenzl “终端在其最后一个子进程退出时关闭。”你测试了吗?
  • 这取决于 OP 实际想要实现的目标。我将其读作“他希望关闭终端”,而您的回答并未发生这种情况。
  • 同意。这个问题模棱两可。
  • @msw: 我试过了,但命令完成后不会退出终端
【解决方案3】:

我已经尝试过这样的事情并且它现在可以工作了:

os.system("xfce4-terminal -e 'bash -c \"./testing.sh ; sleep 20 ; exit 0\"'")

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多