我正在使用Popen进行远程调用脚本

s = Popen(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)]) 

stdout = s.communicate()

打印标准输出

该脚本不会以shell脚本中提到的状态退出,而是仅显示成功或失败状态。

我想根据外壳脚本退出状态代码。 这是shell脚本

tail -Fn0 ${ADM_DOMAIN_LOG} | \
while read LOG_LINE;
do
 echo ${LOG_LINE} | grep -q "${PASS_MSG}"
 if [ $? = 0 ]
 then
   echo "${STATUS_SUCCESS}"
   exit 0
 elif echo ${LOG_LINE} | grep -q "${FAIL_MSG}"
 then
   echo "${STATUS_FAILURE}"
   exit 1
 elif echo  ${LOG_LINE} | grep -q "${FAIL_MSG2}"
 then
    echo "${STATUS_FAILURE}"
    exit 1
 fi
done
exit 

如何获得状态码返回?

===============>>#1 票数:0

subprocess.check_call的文档中

如果返回码为零,则返回,否则引发CalledProcessError CalledProcessError对象将在返回代码returncode属性。

因此,要获取状态码,您需要捕获异常并检索returncode属性。

try:
    check_call(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)]) 
except subprocess.CalledProcessError as e:
    print('status code = %s' % e.returncode)

===============>>#2 票数:0

添加,因为你的问题改变了你的代码使用一个新的答案check_call使用Popencommunicate

subprocess.communicate的文档中

请注意,如果要将数据发送到进程的stdin ,则需要使用stdin=PIPE创建Popen对象。 同样,要在结果元组中获得除None以外的任何内容,您还需要提供stdout=PIPE和/或stderr=PIPE

换句话说,您需要在对Popen的构造函数的调用中添加stdout=PIPE才能使用communicate

s = Popen(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)], stdout=PIPE)
stdout = s.communicate()
returncode = s.returncode

===============>>#3 票数:0

发现的问题:

shell脚本中的tail语句持有SSH会话,这就是为什么Popen无法退出子shell的原因,添加kill -9 ps -eaf |grep tail解决了该问题。

  ask by user2900860 translate from so

未解决问题?本站智能推荐:

3回复

守护进程时不执行Python子进程

我尝试在父类被守护的方法中执行脚本。 autogamma.sh是一个需要安装ImageMagick(并使用convert)的脚本,可以在这里找到: http ://www.fmwconcepts.com/imagemagick/autogamma/index.php 仅在启动MyC
1回复

Android子进程上的Python:/ bin / sh:ls:未找到

当我在android上运行一个旧的Python版本时,该版本为4 GB以上的文件提供了错误的文件大小,因此我尝试编写一种变通方法以获取正确的大小,代码: 当我尝试使用简单的python脚本调用它时,此方法效果很好: 打印(getsize_workaround(路径))
4回复

Python Popen shell脚本但失败了

我想执行bash命令 在使用Popen的python中。 代码不会引发任何异常,但执行后jruby.log上没有任何更改。 python代码如下所示。 我还打印出process.pid,然后使用ps -ef |检查pid grep pid。 结果显示进程pid已完成。
1回复

使用Shell = False的Popen执行python脚本

我想知道是否可以执行此命令 但是shell = False 我试图运行此命令 但它不起作用: 谢谢!
1回复

Python创建一个Popen Shell命令列表

请有人帮我从此创建Popen命令行列表... 我有这个: 但这不起作用。 原始命令行在命令行中可以正常工作。 但是无法以这种方式使其在python中工作。
1回复

杀死由subprocess.Popen(Python)生成的Terminal / tcpdump

我有一个脚本,该脚本应该(除其他事项外)打开一个新的终端窗口并在该终端中运行TCPDUMP。 然后,脚本会在原始窗口中等待用户发信号表示已完成操作(提示等待“ y”)。 在用户输入“ y”时,我需要终止TCPDUMP终端窗口。 这是设置: 这样就一切正常了。 在程序出口,我运行:
1回复

在python中重复使用一个subprocess.Popen实例

我正在使用Python编写流程脚本,在我的代码中,我使用p = subprocess.Popen(['example', 'command', 'and', 'args')进行多次命令行调用。 我最近遇到了一个问题,即几个命令行调用需要sudo权限,因此用户最终不得不多次输入他们的sudo密码
1回复

子进程,Popen Python

我想运行一个程序,比如MATLAB或其他来自Python的FEA软件,等待它运行并存储结果,然后再用Python进行处理。 我无法找到一个关于如何这样做的真正基本的例子。 一个简单的代码或任何有用的链接将受到高度赞赏。 Subprocess模块​​的帮助看起来有点复杂。
2回复

如何在子进程中避免shell = True

我有子进程命令来检查md5校验和为 它工作正常。 但我读过尽量避免shell=True但是当我跑的时候 我收到错误OSError: [Errno 2] No such file or directory 我可以使用shell=False运行上面的命令或解决方法,或者保持s
2回复

如何通过Pythons子进程管道传输到文件或Shell程序?

我正在处理一些相当大的压缩文本文件,这些文件必须解压缩,编辑和重新压缩。 我使用Python的gzip模块进行解压缩和压缩,但是我发现我当前的实现远非最佳: 这种方法的速度差得令人难以忍受-可能是因为使用gzip模块进行每行迭代会涉及大量开销:我最初还运行了一个行数例程,其中我-使用g