是否可以将 top -c -n1 -b 的输出捕获到文本文件中 - 但通过 shell 保留完整输出(即不在右侧截断)

是否可以将 top -c -n1 -b 的输出捕获到文本文件中 - 但通过 shell 保留完整输出(即不在右侧截断)

我用top -c -n1 -b | tail -18 > topout.txt 成功了。

topout.txt显示了进程名称/所用命令的完整输出。

但是 - 一旦我将这行代码复制到 .sh 文件中并通过crontab或手动运行 - 输出总是被截断,即,无论我如何编码,它都会显示 oracle_myp+..”而不是完整的进程条目,如“oracle_myprodbrac1..”

我尝试将其附加到 shell 日志文件(在cron使用 中创建shell_name.sh > shell_name.log 2>&1 )但它似乎总是截断 RHS 部分。

例如:

Top 10 processes during this load ..
Warning! pddb1-nnvwv1 load average exceeds 25 - is 25
age: 25.35, 23.93, 19.84
Tasks: 4855 total,  34 running, 4819 sleeping,   0 stopped,   2 zombie
%Cpu(s): 79.7 us,  8.9 sy,  0.0 ni,  9.5 id,  0.0 wa,  0.0 hi,  1.7 si,  0.2 st KiB Mem : 74261747+total, 17263593+free, 43575846+used, 13422308+buff/cache
KiB Swap: 16777212 total, 16768548 free,     8664 used. 28589158+avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 59924 oracle    20   0   96.3g 469296  98688 R  84.6  0.1   0:44.51 oracleGEC+
 62677 oracle    20   0   96.3g 469428  98824 R  78.8  0.1   0:44.41 oracleGEC+
 68076 oracle    20   0   96.3g 469616  98980 R  78.8  0.1   0:41.54 oracleGEC+
158224 oracle    20   0  102.1g 125592 113388 R  78.8  0.0 452:22.63 oracleGEC+

当我从 $ prompt 运行相同命令时 - 它会向我显示完整的输出;我可以将其假脱机到文件 topout.txt,从 $prompt - 我得到了完整的输出。

当我从 cron / shell 脚本运行它时 - 我看到像上面一样的截断输出。

答案1

man 1 top

-w :Output-width-override as: -w [ number ]

在批处理模式下,如果使用不带参数的 top,将使用COLUMNS=LINES=环境变量(如果已设置)格式化输出。否则,宽度将固定为最大 512 列。使用参数时,输出宽度可以减少或增加(最多 512),但行数被视为不受限制。

在正常显示模式下,如果使用时不带参数,top 将尝试使用COLUMNS=LINES=环境变量(如果已设置)来格式化输出。使用参数时,输出宽度只能减少,不能增加。无论是使用环境变量还是带有 的参数-w,当不处于批处理模式时,实际终端尺寸永远不会超出。

注意:如果不使用此命令行选项,无论是否处于批处理模式,输出宽度始终基于调用 top 的终端。

这对我来说很复杂,也不是很清楚。例如,不清楚“最多 512”是否适用于COLUMNS=设置的情况。我的测试表明是的,最大值是 512(= 511 + 换行符)。

我想如果不修改 ,您就无法解决这个问题top。使用-w 512。非常长的命令将被截断,因此它并不完全符合您的要求。另一方面,您将在交互式 shell 中观察到的输出称为“完整输出”,并且它不能包含超过 512 行;所以也许 512 对您来说就足够了。

即使有时您会遇到截断的行,512 也会比您迄今为止从 cron 作业中获得的 80(左右)要好得多。

相关内容