1

我对用于将文件从服务器复制到 hadoop 的 python-file 感到非常困惑。

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。”

4

2 回答 2

4

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

这是错误的。文档说:

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

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

如果命令以非零退出代码退出,那么您将得到它。

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

这个为什么你得到 255相当的解释很简单,在这里这里-1已经解释 过了。基本上这是由于 Java 允许有符号的 32 位值作为退出代码(我们为 -1),但 Posix 退出状态是无符号的 8 位值。

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

于 2013-03-22T07:36:47.273 回答
1

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

原因wait()不给你 -1 是因为负数是为子进程因信号而退出的情况保留的(如果它由于信号 11 而退出,则返回码将是 -11)。

于 2013-03-22T07:33:35.113 回答