【问题标题】:Top Command Output is Empty when run from cron从 cron 运行时,顶部命令输出为空
【发布时间】:2016-03-15 03:12:45
【问题描述】:

我尝试使用以下命令每 5 分钟重定向一次特定文件中的 TOP 命令输出。

top -b -n 1 > /var/tmp/TOP_USAGE.csv.$(date +"%I-%M-%p_%d-%m-%Y")

-rw-r--r--   1 root root 0 Dec  9 17:20 TOP_USAGE.csv.05-20-PM_09-12-2015
-rw-r--r--   1 root root 0 Dec  9 17:25 TOP_USAGE.csv.05-25-PM_09-12-2015
-rw-r--r--   1 root root 0 Dec  9 17:30 TOP_USAGE.csv.05-30-PM_09-12-2015
-rw-r--r--   1 root root 0 Dec  9 17:35 TOP_USAGE.csv.05-35-PM_09-12-2015

因此我为此制作了一个非常小的(1 行)shell 脚本,这样我就可以通过 cronjob 每 5 分钟运行一次。

问题是当我手动运行此脚本时,我可以看到文件中的输出,但是当此脚本自动运行时,文件每 5 分钟生成一次,但没有数据(又名文件为空)

谁能帮我解决这个问题?


我现在修改了脚本,还是一样。

#!/bin/sh
PATH=$(/usr/bin/getconf PATH)

/usr/bin/top -b -n 1 > /var/tmp/TOP_USAGE.csv.$(date +"%I-%M-%p_%d-%m-%Y")

【问题讨论】:

  • 该命令对我有效,无需更改。所以问题一定是你如何定期触发命令。我假设您为此使用cron作业?如果是这样,请注意PATH 环境变量,以便进程可以实际找到这两个命令(topdate)。或者干脆使用绝对路径。
  • @arkascha 对不起..我不太清楚你的回答..你能帮我理解一下吗。您能告诉我您希望我在命令中做哪些确切的更改吗?
  • 在大多数 Linux 中,top/usr/bin/topdate/bin/date。您的默认PATH 可能在未设置时具有/bin,但没有/usr/bin。在 cron 中指定 /usr/bin/top -b -n 1 > /var/tmp/TOP_USAGE.csv.$(date +"%I-%M-%p_%d-%m-%Y") 或将 stderr 重定向到文件以查看错误消息。在大多数情况下,错误消息在未重定向时会通过电子邮件发送给 cron 作业的所有者。
  • 您是否将stderr 重定向到文件?错误信息是什么?
  • 1.您仍然没有指定 date 命令的路径。我建议你这样做是为了安全起见。明确设置 PATH 变量也已过时。 2. 请也发布您的确切 cron 作业定义,所以整个 crontab 最简单。里面可能会有一些惊喜。 3. 尝试用简单的echo "hi there" 代替top 命令进行测试。那样有用吗? 4. 您应该遵循@alvits 提示并重定向命令的stderr 输出:`/usr/bin/top -b -n 1 2>&1 > /var/tmp/TOP_USAGE.csv.$(date +" %I-%M-%p_%d-%m-%Y"),再次,只是为了临时测试。

标签: linux shell unix cron


【解决方案1】:

很可能从 cron 传递给您的脚本的环境太小了。特别是,PATH 可能不是您认为的那样(从 cron 启动的脚本不会读取任何配置文件)。

PATH=$(/usr/bin/getconf PATH) 放在脚本的开头,然后运行它

/usr/bin/env -i /path/to/script

一旦正常运行,就可以进行 cron 了。

【讨论】:

  • 我尝试了同样的方法,但仍然无法正常工作。手动我得到输出但是当我使用 cronjob 文件是空的。可以分享一下你的看法吗?
  • @LiveCom 你说你修改了你的脚本。如图所示,它已损坏:您必须使用#!/bin/sh 而不是!/bin/sh。我在这里使用了正确的版本,它在 cron 中工作得很好。如果你得到的只是零大小的文件,更多的原因可能是:1)/var/tmp 已满,2)/var/tmp 上的磁盘空间配额已超出。
  • 是的,我做到了..我更正了值..我在上面输入错误。我检查了其他目录等,我没有看到任何与空间相关的问题
【解决方案2】:

我遇到了和你一样的问题。

必须添加带有 -b 选项的 top 命令。在使用前将 top 输出保存到变量中。

脚本如下

日期 >> /tmp/mysql-mem-moniter.log

MEM=/usr/bin/top -b -n 1 -u mysql

回显 "$MEM" | grep mysql >> /tmp/mysql-mem-moniter.log

【讨论】:

  • 修改 bash 脚本
  • 为我工作 - -b 只需要,不需要存储变量。
猜你喜欢
  • 2015-05-03
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
相关资源
最近更新 更多