You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:13