
我正在使用 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
),那么为什么要运行top
?sudo
该 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 时没有运行任何东西。
唯一的其他解释是,你的top
and/orgrep
命令位于非标准位置。如果是这样,请运行type top
并type 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