如何从python停止shell脚本(运行无限循环)?

时间:2019-07-16 14:49:41

标签: python shell sh

我有一个shell脚本(如下所示的test.sh->示例),该脚本具有一个infinte while循环,并将一些数据打印到屏幕上。 我正在从python调用我所有的.sh脚本,我需要在调用其他命令之前先停止test.sh 我正在使用python 2.7,并且linux系统位于专用硬件上,无法安装任何python模块。

这是我的test.sh

#!/bin/sh
while :
do
        echo "this code is in infinite while loop"
        sleep 1
done

这是我的python脚本

import subprocess as SP
SP.call(['./test.sh'])    # I need to stop the test.sh in order for python to
                          # go and execute more commands and call  
                          # another_script.sh
# some code statements

SP.call(['./another_script.sh'])


好吧,快速的Google搜索使我了解了子流程调用和Popen模块。 Popen有一个终止选项,它对我不起作用(或者)我在这里做错了事

cmd=['test.sh']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.terminate()

关于如何从python停止test.sh的任何其他建议,将受到高度赞赏

PS:我不介意将test.sh运行大约T秒钟然后停止它

1 个答案:

答案 0 :(得分:0)

我将tmux用于这类进程,python有一个很好的软件包libtmux,可以解决您的问题。

基本上,您创建一个tmux会话:

import libtmux
server = libtmux.Server()
session = server.new_session(session_name='my_session_name')

然后您创建一个窗口来运行命令

window = session.new_window(attach=False, window_name='my_window_name')
command = './my_bash_file.sh'
window.select_pane('0').send_keys(command, enter=True)

您将能够在此命令之后立即运行后续命令。要从bash终端访问tmux会话,请使用tmux attach -t my_session_name,您将进入一个tmux窗口,该窗口运行您的bash脚本。

要使用window.kill_window()杀死tmux窗口,请查看libtmux文档。

项目aileen有一些有用的tmux命令,如果您想了解更多实现的话。