1

我正在尝试从 java 内部运行一个 bash 脚本,该脚本将在 JVM 退出后继续存在。我目前的尝试看起来像这样:

String[] linCmd = {"/bin/bash", "-c", "\"set +m; shopt -u huponexit; nohup "
   + "myScript.sh 2>&1 > /dev/null &\""};
pb = new ProcessBuilder(linCmd);
//Other stuff to monitor and start pb

但我没有看到 myScript.sh 实际启动(在顶部或 ps 中)。顺便说一句,单独的 bash shell 的原因是因为我需要set +m并且不想用它来破坏原始文件。并且nohupandshopt -u huponexit可能是多余的,但我已经尝试过,没有单独使用它,似乎无法让它正常工作。

有任何想法吗?

4

2 回答 2

2

尝试在“set +m ... &”周围不添加额外的引号通过将整个事物包含为该数组的第三个元素,您是在告诉 java 这整个事物是第三个参数。引号应该是不需要的,我认为它们可能会干扰。

于 2011-07-23T02:37:08.400 回答
0

你可以只后台进程,添加disown对该后台进程的调用,然后让 shell 退出吗?

disown [-ar] [-h] [jobspec ...]

如果没有选项,每个作业规范都会从活动作业表中删除。如果给出 -h 选项,则不会从表中删除每个作业规范,但会进行标记,以便在 shell 接收到 SIGHUP 时不会将 SIGHUP 发送到作业。如果不存在作业规范,并且既没有提供 -a 也没有提供 -r 选项,则使用当前作业。如果没有提供作业规范,-a 选项表示删除或标记所有作业;不带 jobspec 参数的 -r 选项将操作限制为正在运行的作业。除非作业规范未指定有效作业,否则返回值为 0。

于 2011-07-23T01:52:00.857 回答