gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:16:13 27 4
gpt4 key购买 nike

我有一个 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 脚本并了解整个环境。而且,我要做的第一件事就是添加 set -xv在你的 shell 脚本中。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com