我开发了一个包含 top 命令的脚本,该命令应该由调度程序执行当我自己执行它时,我获得了预期的结果,但是当由调度程序执行时我没有得到预期的结果
有问题的代码行是这一行
ESBLOGENTRY=`top -b -n 1 -c|grep " DataFlowEngine"|grep -v grep| gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'|grep ACES_KOFAX_TCM_DRS|sed 's/[ ]*$//'`
我只是执行 top ,没有交互式和完整的命令选项(-b -n 1 -c),然后 grep 并添加时间戳
机器的系统管理员,对 root 甚至我的同一用户执行了 su 命令,有时该进程就消失了(ESBLOGENTRY 变为空)
调度程序使用的用户永远不会获得输出。
关于这可能有什么问题的任何想法吗?
答案1
命令
ESBLOGENTRY=`top -b -n 1 -c|grep " DataFlowEngine"|grep -v grep| gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'|grep ACES_KOFAX_TCM_DRS|sed 's/[ ]*$//'`
假设 的输出top
将至少包含这两个字符串:
DataFlowEngine ACES_KOFAX_TCM_DRS
这是 34 个字符。在快速检查中,top
显示了从第 64 列开始的命令。但top
只显示了最多 80 列的行。如果您的环境设置$COLUMNS
为更广泛的值,则top
可能会使用该值(快速检查一下,这就是 Debian 7 中发生的情况)。这top
手册页说如果你使用一个-w
选项,它将默认为 512 列,但没有提到默认宽度没有选项。
当行被缩短时,grep forACES_KOFAX_TCM_DRS
失败,使脚本返回空字符串。如果您使用-w
选项,您的脚本应该更加一致地工作。
或者,将命令更改为
ESBLOGENTRY=`COLUMNS=128 top -b -n 1 -c|grep " DataFlowEngine"|grep -v grep| gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'|grep ACES_KOFAX_TCM_DRS|sed 's/[ ]*$//'`
将设置环境top
(不干扰其他程序)。