subprocess.wait()有多少种返回码

时间:2013-03-22 07:18:05

标签: python hadoop subprocess

我对python文件非常困惑,该文件用于将文件从服务器复制到hadoop。

cmd是:hadoop fs -put /localhost/* /hadoop/* 代码是:

    cmd = exc_path + ' ' + 'fs -put' + ' ' + src_path + item + ' ' + dst_path
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    code = process.wait()
    logfile.info('type(code) is %s, code is %s\n', type(code), code)

过去几天,它运行正常。但是前天它返回code!=0 昨天,它运行正常,code == 0,然后今天它失败并返回:type(code) is <type 'int'>, code is 255

文档说wait()应该返回0或None,那么为什么我得到255?并且hadoop的cmd'put'应该返回0(成功时)和-1(失败时)。

我找到了一些有用的信息:     “遗憾的是,当使用shell = True运行子进程时,wait()将只等待sh子进程完成而不是命令cmd。” from

2 个答案:

答案 0 :(得分:4)

  

doc说wait()应该返回0或None,但为什么我得到255。

这是错误的。文档说:

Popen.wait()     等待子进程终止。设置并返回returncode属性。

Popen.returncode     子返回码,由poll()和wait()设置(间接由communic()设置)。     “无”值表示该进程尚未终止。     负值-N表示孩子被信号N终止(仅限Unix)。

如果命令以非零exitcode退出,那么你将得到它。

  

hadoop的cmd'put'应该返回0(成功时)和-1(失败时)。

对于255而不是-1的原因的解释非常简单,已经解释过herehere。基本上它是由于Java允许带符号的32位值作为退出代码(对于我们为-1),但Posix退出状态是无符号的8位值。

总而言之,非零退出代码将告诉您命令失败。如果要检查特殊的退出代码,当代码不在0-255范围内时,必须特别小心。

答案 1 :(得分:1)

返回代码255表示Hadoop进程退出并返回-1返回代码(为什么,我不知道)。

wait()给出-1的原因是因为子信息由于信号而退出的情况(例如,由于信号11退出,返回码,因此保留了负数)本来是-11)。