Crontab 命令未将 top 命令结果记录到输出文件中

Crontab 命令未将 top 命令结果记录到输出文件中

我正在使用 Ubuntu 16.04,并且创建了一个 sh 文件。

cd /home/malus
echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
sudo top n 1 o %MEM u mysql | grep mysql >> /home/malus/top.txt

我想将 MySQL 的信息保存到文件 (top.txt) + 日期 + 分隔符中

当我运行 sh 文件时,一切正确,并且输出文件包含 3 行。

但是,当我让 crontab 运行脚本时,输出文件不包含顶部输出,而是有一行空行(我有分隔符 + 日期但没有顶部输出)。

对于 crontab 我使用了这个命令:

sudo crontab -e

内容如下:

00 * * * * /home/malus/top.sh
15 * * * * /home/malus/top.sh
30 * * * * /home/malus/top.sh
45 * * * * /home/malus/top.sh

编辑部分:

当我直接运行脚本文件(./top.sh)时的输出,如您所见,有一些奇怪的字符(在 Notpad++ 中它们是 ESC)

______________________________________________________________________
Wed Apr 10 11:24:33 EDT 2019
(B[m  636 mysql     20   0 3681720 1.233g   4236 S   0.0 63.3 113:35.71 mysqld                                                                           (B[m[39;49m[K

crontab 的输出,如您所见,没有 top 命令的输出:

______________________________________________________________________
Wed Apr 10 11:30:01 EDT 2019

回答

我根据以下情况进行了更改钢铁司机特登(感谢你们二位)

脚本文件:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
sudo top n 2 -b o %MEM u mysql | grep mysql >> /home/malus/top.txt

以 root 身份运行 crontab:

sudo crontab -e

crontab 内容:

00 * * * * /home/malus/top.sh 2>>/home/malus/top.err
15 * * * * /home/malus/top.sh 2>>/home/malus/top.err
30 * * * * /home/malus/top.sh 2>>/home/malus/top.err
45 * * * * /home/malus/top.sh 2>>/home/malus/top.err

答案1

您已将其添加到 root 的 crontab(您运行了sudo crontab -e),那么为什么要运行topsudo该 crontab 中的所有内容都将以 root 身份运行。更重要的是,您应该绝不使用 运行命令,sudo除非该命令需要以 root 身份运行。该top命令永远不需要 root 访问权限,每个用户都会看到相同的输出,因此sudo是没有意义的。cd也是没有意义的,没有必要进入目录/home/malus。因此,将您的脚本更改为:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
top n 1 o %MEM u mysql | grep mysql >> /home/malus/top.txt

话虽如此,我在你的文件中没有看到任何其他问题。命令top/usr/bin/usr/bin 在 cron 的 PATH 中,因此您不需要完整路径。发生的情况可能是该命令没有输出。

例如,如果我在用户正在运行某些东西top的系统上运行你的mysql程序,我会得到:

$ top n 1 o %MEM u mysql | grep mysql
 2379 mysql     20   0 28.915g 5.612g  13516 S   0.0  4.3   2038:41 mysqld         

但是,如果mysql用户没有运行任何东西,则不会有输出,因为grep mysql不匹配:

$ top n 1 o %MEM u mysql | grep mysql 
$ 

因此,如果date正确地将 添加到/home/malus/top.txt,则缺少 的输出top仅意味着mysql用户在运行 crontab 时没有运行任何东西。

唯一的其他解释是,你的topand/orgrep命令位于非标准位置。如果是这样,请运行type toptype grep查看它们在哪里:

$ which top grep
/usr/bin/top
/bin/grep

然后使用这些路径:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
/usr/bin/top n 1 o %MEM u mysql | /bin/grep mysql >> /home/malus/top.txt

但这种情况确实不大可能发生,除非您移动了它们并且它们不在/usr/bin或中/bin

最后,为了进一步调试,更改 crontab 以便它也保留错误输出:

00 * * * * /home/malus/top.sh 2>>/home/malus/top.err
15 * * * * /home/malus/top.sh 2>>/home/malus/top.err
30 * * * * /home/malus/top.sh 2>>/home/malus/top.err
45 * * * * /home/malus/top.sh 2>>/home/malus/top.err

然后查看是否有任何内容写入/home/malus/top.err


您遇到的错误TERM environment variable not set.是因为环境变量$TERM未在 cron 的 shell 会话中设置,并且top需要知道要生成什么样的输出:

$ unset TERM
$ top
TERM environment variable not set.

因此,一个简单的解决方法是在脚本中设置它:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
TERM=xterm top n 1 o %MEM u mysql | grep mysql >> /home/malus/top.txt

相关内容