Java选项-XX:在bash脚本中通过exec调用时,OnOutOfMemoryError不起作用

时间:2011-08-26 17:45:52

标签: 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是类。我该如何防止这种情况?我尝试过双重转义,但这不起作用。

3 个答案:

答案 0 :(得分:1)

引用和逃避是一门艺术。我建议你在调用exec之前添加echo ${cmd},这样你就可以看到它的样子了。

我建议使用

cmd='java -server  -XX:OnOutOfMemoryError=\\"./oom_script %p\\"  TestOOMClass'
而是(未经测试)。在回显时,你需要它看起来像\"

答案 1 :(得分:1)

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

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。无论是什么,当你打开详细/调试模式时,你通常会很快发现问题。

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

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

答案 2 :(得分:1)

我建议的另一种选择(绕过问题,而不是解决它)是按行和bash脚本并访问$ PPID:

   PPID   The process ID of the shell's parent.  This variable is readonly.

然后使用该ID终止进程(请记住这是未经测试的建议)