我对python文件很困惑,它用于将文件从服务器复制到hadoop。
命令是: 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或无,那么为什么要得到255?hadoop的cmd'put'应该返回0(成功时)和-1(失败时)。
我发现了一些有用的信息:“遗憾的是,当使用shell=true运行子进程时,wait()只会等待sh子进程完成,而不会等待命令cmd。”
2条答案
按热度按时间ijxebb2r1#
返回码255表示hadoop进程退出时
-1
返回代码(为什么我不知道)。原因是什么
wait()
不给你-1是因为当子进程由于信号而退出时会保留负数(如果它因为信号11而退出,那么返回码应该是-11)。dluptydi2#
doc说wait()应该返回0或none,但是为什么我会得到255。
这是错误的。文件上说:
wait()等待子进程终止。设置并返回returncode属性。
和
子返回码,由poll()和wait()设置(间接由communicate()设置)。none值表示进程尚未终止。负值-n表示子级被信号n终止(仅限unix)。
如果命令以非零exitcode退出,那么您将得到它。
hadoop的cmd'put'应该返回0(成功时)和-1(失败时)。
这就是为什么你
255
相当-1
非常简单,这里和这里已经解释过了。基本上,这是由于java允许有符号的32位值作为退出代码(对我们来说是-1),但是posix退出状态是一个无符号的8位值。总而言之,非零退出代码将告诉您命令失败。如果要检查特殊退出代码,则当代码不在0-255范围内时必须特别小心。