Java选项-XX :OnOutOfMemoryError does not work when called through exec in bash script

标签 java bash

我有一个java应用程序,我想在遇到OutOfMemoryException时运行一个脚本

这很好用:

$ java -server -XX:OnOutOfMemoryError="./oom_script %p"TestOOMClass

不幸的是,我的应用程序是由生产中的 bash 脚本运行的。该脚本可归结为:

cmd='java -server  -XX:OnOutOfMemoryError="./oom_script %p"  TestOOMClass'
##does a lot of checking and cmd building here
exec -a app  ${cmd}

当像这样运行时,java从不尊重双引号并认为%p是类。我该如何防止这种情况?我尝试过双重转义,但不起作用。

最佳答案

由于您的程序作为 shell 脚本运行,因此我建议将其作为 shell 脚本中 shebang 之后的第一行。 :

set -xv

然后,在 crontab 中,将 2>&1 放在命令行末尾,这样 STDERR 和 STDOUT 就会合并。 Crontab 通常会将命令的 STDOUT 通过电子邮件发送给 root,以便您可以看到输出是什么。如果没有,则将以下内容附加到 crontab 中命令的末尾:

> /somedir/output.$$ 2>&1

确保 somedir 存在,并且在 crontab 运行命令后,您将看到详细的调试输出。 shell 脚本中的每一行都将在执行之前显示 - 无论是书面形式还是 shell 实际解释的内容。

set -xv 在调试任何销售脚本时非常有用。 cronjob 和在您的登录名下运行的脚本之间可能会涉及各种环境问题。您甚至可能会发现 shell 问题。例如,crontab 通常在 Bourne shell 中执行 shell 脚本,并且您可能将 Bash 或 Kornshell 作为默认 shell。无论是什么,当您打开详细/ Debug模式时,您通常会很快发现问题。

您甚至不必对整个脚本执行此操作。您可以将 set -xv 放在脚本中的任意位置以打开详细/ Debug模式,并使用 set +xv 将其关闭。

我可以提出一些虔诚的高尚建议(使用引号,不要假设环境因素,在命令行中添加“bash -c”前缀以确保您使用正确的 shell 等),但这会猜测可能出了什么问题。为了真正调试这个问题,我需要查看机器,了解操作系统,查看整个 shell 脚本,并了解整个环境。而且,我要做的第一件事就是在 shell 脚本中添加 set -xv

关于Java选项-XX :OnOutOfMemoryError does not work when called through exec in bash script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7208604/

相关文章:

java - 如何在java中跨类的多个实例编辑文本文件的结尾

linux - 从文件中读取行并直接写入 FIFO,无需在 RAM 中缓冲

linux - 如何在 bash 中编写一个返回 ASCII 字符而不使用 printf 的函数

linux - cronjob 运行的 .sh 脚本不发送电子邮件

java - 如何检查从 Google Place Search 获得的结果中是否存在 'rating' 字段?

java - 抽屉导航中 webview 的 findViewById 问题

java - Shadow jar 缺少常见的 java 类

java - 将字符串数组转换为列表 : double brackets

bash 变量作为 awk 字段宽度

terminal - 使用 bash_profile 自定义终端命令