我有一个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秒钟然后停止它
答案 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命令,如果您想了解更多实现的话。