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

bqujaahr  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(381)

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

ijxebb2r

ijxebb2r1#

返回码255表示hadoop进程退出时 -1 返回代码(为什么我不知道)。
原因是什么 wait() 不给你-1是因为当子进程由于信号而退出时会保留负数(如果它因为信号11而退出,那么返回码应该是-11)。

dluptydi

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范围内时必须特别小心。

相关问题