使用Fabric2执行远程SSH命令时遭遇Exit code 127错误
解决Fabric2执行yarn命令提示"bash: yarn: command not found"的问题
这问题我之前踩过坑!核心原因是Fabric 2默认使用非交互式非登录shell执行远程命令,而你直接通过SSH登录服务器时是交互式登录shell,两者加载的环境变量配置文件不一样,导致yarn的路径没被加入到$PATH环境变量中,所以找不到命令。
下面给你几个可行的解决办法:
手动指定yarn的绝对路径
先通过SSH登录服务器,执行which yarn找到yarn的绝对路径(比如/opt/hadoop/bin/yarn或者/usr/local/bin/yarn),然后在Fabric的命令里直接用这个路径执行:conn.run("/opt/hadoop/bin/yarn your-mapreduce-command")执行命令前先加载环境变量配置文件
如果yarn的路径是在~/.bashrc、~/.bash_profile或者/etc/profile这类文件里配置的,可以在执行yarn命令前先source对应文件:# 比如加载用户的bashrc conn.run("source ~/.bashrc && yarn your-mapreduce-command") # 或者加载系统级的profile文件 conn.run("source /etc/profile && yarn your-mapreduce-command")注意不同Linux发行版的环境变量配置文件可能不同,你可以先确认自己的yarn路径是在哪个文件里配置的。
配置Fabric使用登录shell执行命令
你可以在创建Fabric连接时,指定使用登录shell(-l参数),这样会自动加载登录时的环境变量配置:from fabric import Connection # 指定shell为bash登录shell conn = Connection("your-server-ip", shell="/bin/bash -l -c") conn.run("yarn your-mapreduce-command")
这几个方法都能解决环境变量不加载的问题,你可以根据自己的实际情况选一个最方便的。
内容的提问来源于stack exchange,提问作者zar3bski
相关产品推荐
相关产品推荐

