如何从Python脚本执行时检查bash shell脚本的状态?

时间:2014-01-01 05:16:28

标签: python linux bash shell scp

我有一个简单的Python脚本,它将使用Python中的subprocess模块执行shell脚本。

下面是我的Python shell脚本,它调用testing.sh shell脚本,它运行正常。

import os
import json
import subprocess

jsonData = '{"pp": [0,3,5,7,9]}'
jj = json.loads(jsonData)

os.putenv( 'jj3', ' '.join( str(v) for v in jj['pp']  ) )

print "start"
proc = subprocess.Popen('testing.sh', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if stderr:
   print "Shell script gave some error"
   print stderr
else:
   print stdout
   print "end" # Shell script ran fine.

以下是我的testing.sh shell脚本 -

#!/bin/bash

dir1=some_directory
dir2=some_directory

length1=some_number
length2=some_number

if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
    for el in $jj3
    do
        scp david@machineB:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/. || scp david@machineC:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/.
    done        
fi

我的上述shell脚本的作用是,它会将文件从machineBmachineC复制到machineA。如果machineB中的文件不存在,那么它始终存在于machineC中。因此,它会尝试将文件从machineB复制到machineA,但如果machineB中的文件不存在,则会尝试将文件从machineC复制到{{} 1}}。

现在我上面的Python脚本(我从machineA运行)尝试执行我的上面的shell脚本,看看我的脚本是否成功执行。正在我存储我的shell脚本的machineAstderr

问题陈述: -

通过上述方法,我看到了一个问题。正如我所提到的,stdout中的文件不存在,那么它会尝试将文件从machineB复制到machineC。因此,每当我运行调用我的shell脚本的Python脚本时,会发生的情况是,machineA中没有某些文件,因此会抛出一些异常,然后尝试从machineB复制文件,但是调用回到Python脚本,它总是进入machineC块,因为从if stderr:复制文件时出错(这不是我想要的)和machineB print statement doesn'打印出来。

所以问题是如果end中没有文件,它会尝试从machineB复制文件,如果文件存在machineC并成功复制到machineC {1}}没有任何错误,我想将其称为machineA而不是success。在当前情况下发生了什么,如果failure中的文件不存在并且已成功从machineB复制,那么它仍会被视为失败并且machineC打印语句不会被打印出来

我还想看看我的shell脚本在从Python执行时是否有任何问题。如果是,那么我不想打印end声明。

我该如何克服这个问题?

更新: -

以下shell脚本会发生什么?由于第一个end循环失败,因为for不是linux命令,但我的david命令工作正常。所以我仍然会看到状态代码不等于scp

0

1 个答案:

答案 0 :(得分:0)

正常运行的流程仍然可以写入stderr,因此使用if stderr:检查问题是错误的

相反,您应该检查进程退出代码。如果它不等于零,则出现错误,例如:

[...]
if proc.returncode != 0:
    print "Shell script gave some error"
[...]