如何在完成进程后终止终端

时间:2013-06-01 10:34:42

标签: python bash shell ubuntu

我正在为我的项目学习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  

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

3 个答案:

答案 0 :(得分:4)

让我们回过头来仔细查看您发布的一个主要代码行:

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。
  • 最后,由于我不清楚的原因,它会再次发生冲击。

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

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-terminal:

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

答案 1 :(得分:0)

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

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

我测试过。

在回复评论时添加

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

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

然后出现一个终端,显示脚本的输出,然后终端退出。它真的不能简单得多。

答案 2 :(得分:0)

我尝试了类似这样的事情,现在正在努力:

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

感谢您的帮助。