top命令通过crontab执行时COMMAND列路径被截断的解决办法
解决crontab执行top脚本时COMMAND列路径被截断的问题
问题描述
我在Linux系统上编写了example.sh脚本:
#!/bin/sh TOPLOG=/tmp/top.log date +%H:%M:%S >> ${TOPLOG} top -b -c -n 1 |head -n 8 |tail -n 2 >> ${TOPLOG} echo >> ${TOPLOG}
手动执行sh /tmp/example.sh时,/tmp/top.log中的COMMAND列能显示完整路径:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17980 cybereas 20 0 1478m 73m 18m S 2.0 0.5 1360:59 /opt/cybereason/sensor/bin/cybereason-sensor
但通过crontab任务*/1 * * * * sh /tmp/example.sh执行时,COMMAND列的路径被截断:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17980 cybereas 20 0 1478m 73m 18m S 2.0 0.5 1360:59 /opt/cybereason/sen
解决方法
方法1:在top命令中指定COLUMNS环境变量
crontab的执行环境没有终端,top会默认使用80列宽度格式化输出,导致路径截断。可以显式设置足够大的列宽,比如将脚本中的top命令行替换为:COLUMNS=200 top -b -c -n 1 | head -n 8 | tail -n 2 >> ${TOPLOG}把COLUMNS值设为比最长路径更宽的数值即可。
方法2:在crontab任务中设置COLUMNS
直接在crontab任务行前声明环境变量,让整个脚本执行环境使用指定列宽:*/1 * * * * COLUMNS=200 sh /tmp/example.sh方法3:用ps命令替代top(可选)
如果不需要top的实时排序等特性,ps命令默认不会截断命令路径,可替换脚本中的top相关逻辑:date +%H:%M:%S >> ${TOPLOG} # 模拟top输出前2行进程(含表头),按CPU使用率降序 ps -eo pid,user,pr,ni,virt,res,shr,s,%cpu,%mem,time+,cmd --sort=-%cpu | head -n 3 >> ${TOPLOG} echo >> ${TOPLOG}
原理说明
top在批量模式(-b)下,若没有终端环境会默认采用80列宽度输出;而手动执行时继承了当前终端的宽度(通常大于80),因此能显示完整路径。显式设置COLUMNS环境变量可强制top使用指定宽度,避免截断。
内容的提问来源于stack exchange,提问作者leaN5525
相关产品推荐
相关产品推荐

