ps引发的血案
Posted opama
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ps引发的血案相关的知识,希望对你有一定的参考价值。
开发的shell脚本有一段用于判断进程是否启动,代码如下
start cadvisor fail
逻辑没什么问题,但通过NAS执行后总是返回
start cadvisor fail
登录机器后,用ps aux可以查到进程实际是启动的,而在机器上执行脚本也是成功的
增加打印,然后调用NAS接口执行,发现进程名出现了被截断的情况,如docker进程后面的参数全没了,而本来是cadvisor进程的,显示为root 3242 2.0 0.3 78148 6308 ? Sl 20:50 0:00 /usr/local/bin/
root 2924 0.1 0.0 9420 1576 ? S 20:50 0:00 bash v2.0/node- root 3166 2.8 0.5 259720 11948 ? Sl 20:50 0:00 /usr/bin/docker root 3173 0.0 0.0 0 0 ? S< 20:50 0:00 [loop0] root 3174 0.0 0.0 0 0 ? S< 20:50 0:00 [loop1] root 3175 0.0 0.0 0 0 ? S< 20:50 0:00 [kdmflush] root 3177 0.0 0.0 21248 868 ? S 20:50 0:00 udevd --daemon root 3178 0.0 0.0 21248 992 ? S 20:50 0:00 udevd --daemon root 3180 0.0 0.0 0 0 ? S< 20:50 0:00 [bioset] root 3181 0.0 0.0 0 0 ? S< 20:50 0:00 [kcopyd] root 3182 0.0 0.0 0 0 ? S< 20:50 0:00 [bioset] root 3183 0.0 0.0 0 0 ? S< 20:50 0:00 [dm-thin] root 3184 0.0 0.0 0 0 ? S< 20:50 0:00 [bioset] root 3242 2.0 0.3 78148 6308 ? Sl 20:50 0:00 /usr/local/bin/ root 3250 0.0 0.0 15312 1128 ? R 20:50 0:00 ps aux
输出这东西跟终端十有八九脱不了干系, 可能设置显示的长度在使用NAS的时候和直接在终端里的不相同
打印了下
直接在机器上执行setty -a
并echo $COLUMNS
,结果如下
#setty -a speed 38400 baud; rows 52; columns 200; line = 0; #echo $COLUMNS 200
使用NAS调用脚本时,增加打印COLUMNS的值,结果COLUMNS=80
直接在机器上将COLUMNS设置为80, 结果复现了被截断的问题
#export COLUMNS=80 #ps aux root 3520 0.6 0.9 120996 20164 ? Sl 13:17 1:01 /usr/local/bin/ root 3595 0.2 0.9 32480 20040 ? Sl 13:17 0:22 /usr/local/bin/ root 7165 0.0 0.0 35728 1140 ? S 15:49 0:00 /USR/SBIN/CRON root 7166 0.0 0.0 35728 1144 ? S 15:49 0:00 /USR/SBIN/CRON
看来是因为字符长度限制的问题,鬼知道NAS的环境变量从谁那里继承过来的~~
如果需要解决ps显示进程的长度被截断的问题,方法也比较多,可以修改下ps的命令能够输出足够长,man ps了一下,发现了这个w参数
-w Wide output. Use this option twice for unlimited width. --width n Set screen width.
追加使用ww
参数后,脚本执行正常。
写shell脚本的人经常会遇到环境变量这样的大坑,所以尽量选择稳妥的实现方式或者通过自己设置环境变量来规避这样的问题
以上是关于ps引发的血案的主要内容,如果未能解决你的问题,请参考以下文章