- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 OOME 发生时重新启动进程。 Java 二进制文件使用两个 shell 脚本启动,其中一个导入另一个。我无法控制第一个,但可以根据需要修改第二个。这是我正在尝试做的原型(prototype):
第一个shell脚本test.sh:
#!/bin/sh
JAVA_OPTS="$JAVA_OPTS -Xmx10m"
. test1.sh
echo $JAVA_OPTS
java $JAVA_OPTS $es_params TestMemory
第二个shell脚本test1.sh:
#!/bin/sh
pidfile="test.pid"
touch $pidfile
params="$parms -Dpidfile=$pidfile"
kill_command="kill -9 \$(cat $pidfile)"
dir=$( cd $(dirname $0) ; pwd -P )
path="$dir/$(basename $0)"
start_command="$path $@"
restart_command="$kill_command;sleep 2;$start_command"
JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"$restart_command\""
一般它所做的是在 test1.sh 中构建 JAVA_OPTS 然后用于运行 Java 二进制文件,它只是将 PID 写入 pidfile 然后创建 OOME。
执行过程中出现问题,java无法理解什么是参数,什么是要运行的类。我认为这可能是引用的问题,我尝试了不同的方法来转义 JAVA_OPTS,但没有任何结果。我要么得到:
Unrecognized option: -9
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
或者
Error: Could not find or load main class "-XX:OnOutOfMemoryError=kill
如果我只是获取 JAVA_OPTS 的值并将其手动放入 test.sh 中,它会完美运行。任何想法如何更改 test1.sh 以使其工作?我想我几乎尝试了所有可能的方式来放置双引号和单引号,但没有成功。另外,如果我将 restart_command 放在 restart.sh 文件中并使用它代替变量,它也能正常工作。
运行 set -x 后,我看到 shell 将每个空格字符修改为 ' ' - 在两边添加 '。转义不会产生任何结果。知道如何避免这种情况吗?所以最后的表扬是:
+ java -Xmx10m '"-XX:OnOutOfMemoryError=kill' '$(cat' 'test.pid);sleep' '2;/Users/davidt/test/TestMemory/bin/test.sh' '")' -Des.pidfile=test.pid TestMemory
我可以成功运行简化命令
java "-XX:OnOutOfMemoryError=echo 'Ups'" $es_params TestMemory
但这似乎是一个普遍的问题,我猜 shell 只是讨厌变量中的空格:
JAVA_OPTS="\"-XX:OnOutOfMemoryError=echo 'Ups'\""
set -x
java $JAVA_OPTS TestMemory
此脚本失败,最后一行解释为:
java '"-XX:OnOutOfMemoryError=echo' ''\''Ups'\''"' TestMemory
我尝试了不同的选择来逃脱
最佳答案
这是一个 shell 问题。根据证据,我会说其中一个 ;
字符......可能还有一些为什么空格......当你不希望/需要这种情况发生时,shell会解释它.
如果在运行试图启动 JVM 的命令之前在 shell 中运行 set -x
,您将看到正在使用的实际命令。
It seems shell translates every single space to ' ',
不完全是。单引号由 shell 插入到您从 set -x
获得的输出中。它们只是指示参数边界在哪里。它们实际上并不存在......而且它们肯定不会传递给 java
命令。
Any idea how to [a]void it?
您需要做的是从您尝试执行的(最终)命令开始......
java -Xmx10m -XX:OnOutOfMemoryError="kill NNNN;sleep 2;/Users/davidt/test/TestMemory/bin/test.sh" -Des.pidfile=test.pid TestMemory
... 并向后工作,以便 shell 变量、扩展和转义为您提供所需的东西。
另一件需要注意的事情是:
java -Xmx10m -XX:OnOutOfMemoryError="kill $(cat test.pid); ..."
可能行不通。 kill $(cat test.pid)
命令使用 shell 语法并需要 shell 功能来插入 PID 文件的内容。我怀疑 JVM 是否会知道如何处理它。 (或者更准确地说。它会按照你的字面意思告诉它去做,但这不会是你想要的......)
如果您确实需要在运行重启命令时插入 pid 文件内容,就像您似乎正在尝试做的那样,那么建议将重启命令转换为独立的 shell 脚本,并设置文件模式,使其可执行。开始工作会更简单、更容易。
作为一条一般性建议,对 shell 脚本过于聪明并不是一个好主意。变量扩展和命令解析的确切语义相当棘手,如果您尝试在多个级别执行此操作,很容易让自己感到困惑。
关于java - 在 -XX :OnOutOfMemoryError using shell script gives: Unrecognized option: -9 上重新启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26684777/
我住在荷兰,货币是用逗号 (,) 而不是点 (.)即 14.95 的 feeds 被解释为数字而不是 14.95 欧元 有没有可以解决这个问题的LINUX命令(sed?)?所以14.95变成了14,9
我想问: 我有两个表employee,其中包含字段ID、Fullname、email...和表task 包含字段 name_task、list_employee... 使用字段list_employe
请看下面的测试数据。我想获取 avgtime (=timeonsite/visits) 并在 mysql 中显示为“xx:xx:xx”结果。我怎样才能得到它? SET FOREIGN_KEY_CHEC
我必须处理一个大文件(几 MB)并从中删除带有时间标记的注释。一个例子: blablabla 12:10:40 I want to remove this blablabla some more e
所以我有这些数据直接从 iTunes 复制/粘贴: Excel 具有“XX:XX:00”格式,即“hh:mm:ss”,但您可以想象,它更像“mm:ss:00”。音乐时间不长! 由于这不是直接的单元格格
我有一个对象列表,我想使用 Option.Numero_Reference 属性对其进行排序。 Numero_reference 是一个 xx.xx.xx 格式的字符串 有没有办法按 xx 组排序?
我正在尝试部署 nginx - ingress kubectl run nginx --image=nginx kubectl get pod NAME
我有一个日期“2014-07-02 20:57:38 +0000”,我想将它的格式设置为“今天晚上 8:57”。我希望如果一个字符串是昨天,则将其显示为“昨天上午 9:00”。如果既不是今天也不是昨天
目前我使用的是Apache http components client V4.3.5。在我的例子中,我可以上传小文件(1kb),但是当我运行代码并得到异常“org.apache.http.NoHtt
我在 Linux (RHEL 7) 中运行 HTTPS 服务器。我一启动服务器就收到以下错误。 2019/09/04 15:46:16 http: TLS handshake error from x
我正在参加 CTF 挑战赛,该挑战赛有一个链接,如下所示:46.XXX.XX.XX:8008/ 如果我打开该页面中的开发者工具,我可以找到一个小程序,其属性代码值为“mPage.class”
你好 我想每隔 X 小时在我的程序中运行一个方法,该怎么做?我正在谷歌搜索,但什么也没有:/ 最佳答案 你可以考虑Quartz . 它是在 java 中运行的某种 cron。不过我承认,如果您只想安排
我正在尝试检查 NSString 是否为特定格式。 日:日:日。我在想 NSRegularExpression。有点像 /^(\d)\d:\d\d:\d\d)$/? 最佳答案 你有没有试过这样的事情:
我收到错误 git 存储库的 RSA 主机 key 不在已知主机列表中。当我使用存储库 URL 作为我的 git 克隆 URL 运行 jenkins 作业时。 我尝试在运行作业的主机中克隆相同的存储库
我有一个计数器,每 1 秒计数一次,并将 1 添加到 int。 问题 如何格式化我的字符串,使计数器看起来像这样: 00:01:23 代替: 123 我尝试过的事情 到目前为止我尝试过的事情: for
ERROR 2003 (HY000): Can't connect to MySQL server on 'xx.xx.xx.xx.' (60) 我在尝试远程连接到此服务器时收到此错误。我最近硬重启了
我正在尝试将一些数据从客户端浏览器插入到 AWS 服务器上的 MySQL 数据库。 该代码在 godaddy 上运行,因此看起来像是权限/安全问题。 $servername = "xx.xx.xx.x
我想知道是否有标准方法可以以“UTC+XX:XX”或“UTC-XX:XX”格式返回设备的当前时区? 基于格式化 NSDate 我知道可以在“ZZZZ”的帮助下获得当前时区,它给出“GMT-08:00”
我的 JVM 有 -server 选项,我相信它使 JVM 能够使用 C2 编译器,这意味着用于服务器应用程序,这些应用程序往往比客户端应用程序运行时间更长。但是,GRAAL JIT(由 -XX:+U
public void colortemperatureJSliderStateChanged(ChangeEvent event) { fahrenheitdegree = colortemp
我是一名优秀的程序员,十分优秀!