我对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
答案 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
的原因的解释非常简单,已经解释过here和here。基本上它是由于Java允许带符号的32位值作为退出代码(对于我们为-1),但Posix退出状态是无符号的8位值。
总而言之,非零退出代码将告诉您命令失败。如果要检查特殊的退出代码,当代码不在0-255范围内时,必须特别小心。
答案 1 :(得分:1)
返回代码255表示Hadoop进程退出并返回-1
返回代码(为什么,我不知道)。
wait()
给出-1的原因是因为子信息由于信号而退出的情况(例如,由于信号11退出,返回码,因此保留了负数)本来是-11)。