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 -aecho $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脚本的人经常会遇到环境变量这样的大坑,所以尽量选择稳妥的实现方式或者通过自己设置环境变量来规避这样的问题

 
原文地址:https://www.cnblogs.com/opama/p/5836599.html