【问题标题】:Running Jstack -F $Thread_NID with Crontab使用 Crontab 运行 Jstack -F $Thread_NID
【发布时间】:2013-11-14 04:10:52
【问题描述】:

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

为了计算 CPU 使用率,我使用 mpstat 1 1|tail -1 并从中获取 CPU 空闲使用率。

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

现在问题来了

JSTACK_OUTPUT=$(jstack -F $Thread_Nid)

echo "$JSTACK_OUTPUT" >> $logfile

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

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

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

【问题讨论】:

    标签: shell unix crontab jstack


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      只要使用这个命令:

      #which jstack
      

      你会得到这里的jstack路径:

      ~/jdk1.7.0_79/bin/jstack
      

      在脚本中使用这个:

      ~/jdk1.7.0_79/bin/jstack $pid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2014-07-17
        • 2016-06-03
        • 2017-08-31
        相关资源
        最近更新 更多