云助手是专为云服务器ECS打造的原生自动化运维工具,可以免密码、免登录、无需使用跳板机执行命令。本文介绍Linux实例使用云助手与在ECS实例操作系统本地执行命令的差异。
背景信息
云助手客户端作为一个服务运行在ECS实例中,直接与阿里云相关服务端通信,获取并执行命令后上报结果。云助手客户端与用户使用SSH等方式远程连接到ECS实例上执行命令的通信链路不同,因此使用云助手与登录ECS实例执行命令的结果可能存在差异。
云助手执行命令的环境变量和ECS实例本地执行存在差异
可能原因
/bin/bash
)会加载环境配置和初始化相关的启动文件,例如/etc/profile、~/.bash_profile、~/.bashrc等。这些启动文件中通常会包含部分环境变量,例如HOSTNAME
,您可以使用export
命令查看环境中的变量信息,示例如下:[root@localhost ~]# export
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="ALiYun-ASSIST-TEST"
declare -x LANG="zh_CN.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="rs=0:di=38;5;27:*"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/etc/profile.d"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="42.120.XX.XX 34192 22"
declare -x SSH_CONNECTION="42.120.XX.XX 34192 192.168.0.47 22"
declare -x SSH_TTY="/dev/pts/1"
declare -x TERM="xterm-256color"
declare -x USER="root"
declare -x XDG_RUNTIME_DIR="/run/user/0"
declare -x XDG_SESSION_ID="520"
export
命令查看当前环境可用的变量,示例如下:export HOME="/root"
export INVOCATION_ID="0828f2e5b64b4a96****
export JOURNAL_STREAM="8:23203"
export LANG="en_US.UTF-8"
export OLDPWD
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
export PWD="/root"
export SHLVL="2"
export TERM="vt220"
export _="/usr/local/share/aliyun-assist/2.2.3.221/../work/script/t-xx.sh"
所以,当您使用云助手执行命令时,如果待执行的命令中需要使用云助手中没有的环境变量,或者所执行的命令和程序依赖云助手中没有的环境变量,则会导致命令执行失败或者执行结果不符合预期。
解决方案
您可以在云助手中加载待执行的命令或执行命令调用的程序需要的启动文件,然后补充缺少的相关变量后,重新执行命令,操作步骤如下:
云助手执行命令和ECS实例本地执行结果不一致
使用云助手执行ulimit -n
命令时,输出结果为1024,但是在ECS实例本地执行ulimit -n
时,输出结果为65535。
可能原因
/etc/security/limits.conf
资源限制文件用于设置系统登录用户的资源限制,在ECS实例本地执行cat /etc/security/limits.conf
命令,可以打开的文件描述符最大数量为65535。因此,在ECS实例本地执行ulimit -n
命令时,输出结果为65535。[root@localhost ~]# cat /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
[root@localhost ~]# ulimit -n
65535
通过云助手执行ulimit -n
命令时,/etc/security/limits.conf
资源限制文件对系统服务无限制效果。云助手服务进程由运行在系统服务上的init引导启动,该进程打开的文件描述符最大数量为1024。因此,云助手执行ulimit -n
时,输出结果为1024。
cat /proc/云助手进程PID/limits
命令,可以查看云助手服务进程的资源限制情况。[root@localhost ~]# cat /proc/$(pidof aliyun-service)/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 30546 30546 processes
Max open files 1024 262144 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 30546 30546 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
解决方案
在ECS实例上将云助手服务的资源限制设置为65535,设置方式与系统启动模式有关。
查询ECS实例系统启动模式的方法如下:
设置云助手服务资源限制的方式如下:
系统启动模式 | 如何操作 |
---|---|
systemd |
|
非systemd |
|
使用云助手执行命令后,执行结果输出不完整
可能原因
云助手执行命令输出结果大小限制为16 KB,因此,当命令执行结果的文件大小超过16 KB时,相比较于本地执行命令,使用云助手执行命令输出的结果不完整。
解决方案
建议您将云助手命令的输出结果保存到本地日志或存储到OSS中。
使用云助手执行命令失败,但ECS实例本地执行没有报错
可能原因
- 可能原因1:
使用云助手执行和ECS实例本地执行命令,脚本的退出码均是最后一条命令的返回值,如果该值非零,系统就会提示失败。有的命令在ECS实例本地执行虽然退出码非零,但执行结果中无明显报错,用户会以为命令是执行成功的,此时,使用云助手执行命令就会提示失败。
- 可能原因2:
云助手执行命令时,会将命令保存成脚本,然后通过
sh -c "./script"
方式执行命令。ECS实例本地执行命令时,使用Bash解释器执行。由于解释器差异,可能存在使用云助手执行命令失败,但ECS实例本地执行正常的情况。例如Sh解释器不支持进程替换<(cmd)
语法而Bash解释器支持,此时,使用云助手执行命令就会提示执行失败。
解决方案
使用云助手执行命令前,在命令首行增加#!/bin/bash
命令,指定使用Bash解释器。
在Debian、Ubuntu和UOS实例使用云助手执行报语法错误但本地执行脚本正常
可能原因
在Debian、Ubuntu和UOS实例中,当用户交互式登录实例后,默认分配的Bash环境是/bin/bash
,该环境的默认配置被定义在/etc/adduser.conf中。当在非交互式登录环境后,执行脚本且在脚本中未定义解释器时,默认是用/bin/sh
执行。
在Debian、Ubuntu和UOS实例中,/bin/sh
被链接到了dash,因此使用云助手执行命令可能会因为语法不兼容导致执行失败,例如执行Bash特有的source
命令或function
关键字定义函数等,更多信息,请参见Shell。
解决方案
使用云助手执行命令前,在命令首行增加#!/bin/bash
命令,指定使用Bash解释器。