0

我创建了一个 Unix Shell 脚本,当 cpu 使用率高于 80% 时,我尝试在其中进行线程转储。

用于计算 cpu 使用情况mpstat 1 1|tail -1并从中获取 cpu 空闲使用情况。

然后我找到了基于的顶级 Java 线程top -b -n1 -H,并且使用jstack -F $Thread_Nidthread_nid 只不过是我们从中获得的 pid top-b -n1 -H

现在的问题是

JSTACK_OUTPUT=$(jstack -F $Thread_Nid)

echo "$JSTACK_OUTPUT" >> $logfile

当我手动运行脚本时工作正常,我在日志文件中获得了 jstack 输出,但是当我通过 crontab 运行脚本时,Jstack 输出没有进入日志文件。

手动以及通过 Crontab 都在相同的用户名下运行脚本,我已经通过在脚本运行时检查 top 命令中的用户名来验证这一点。

请让我知道我在这里做错了什么。

4

2 回答 2

0

正如您提到的脚本在手动执行时运行良好并且在 crontab 中失败,您似乎错过了它的目录。当您将脚本保存在 crontab 中时,请检查您是否提到了路径名。
这是错误的:30 08 10 06 * backup.sh
这是正确的:30 08 10 06 * /home/ramesh/full-backup.sh

于 2013-11-14T05:28:35.973 回答
-1

因为,当我们从终端运行时,我们不需要传递jstack包所在的 java home 的完整路径。

只需使用以下命令:

#which jstack

你会得到这里的 jstack 路径:

~/jdk1.7.0_79/bin/jstack

在脚本中使用它:

~/jdk1.7.0_79/bin/jstack $pid
于 2020-12-15T05:47:55.057 回答