【问题标题】:Starting a bash script from inside java that lives on after the jvm exits从 java 内部启动一个 bash 脚本,该脚本在 jvm 退出后仍然存在
【发布时间】:2011-07-23 01:42:56
【问题描述】:

我正在尝试从 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 并且不想用它来破坏原始文件。 nohupshopt -u huponexit 也可能是多余的,但我已经尝试过不单独使用它们,但似乎无法使其正常工作。

有什么想法吗?

【问题讨论】:

  • 顺便说一句,linCmd = { "nohup", "myScript.sh", "2>&1", ">/dev/null", "&"}; 启动了脚本,但脚本在调用 JVM 时立即终止。
  • Java 的进程管理能力很差,因为这是固有的平台特定行为。我建议在 C 或 Perl 中执行此操作。
  • @Amir Afghani 当然,这本质上是一个特定于平台的命令......因此是“linCmd”,是的,还有一个“winCmd”版本。有时我们必须在不太理想的工具中处理依赖于平台的行为。只是野兽的本性。
  • 我的意思是 Java 不擅长做这件事,并不是说你永远不应该这样做。
  • @Amir Afghani 哦,是的。绝对不是最好的工具,但它就是我所拥有的。另一方面,我偶尔也会使用螺丝刀的背面将钉子钉入石膏板,因为这是我随身携带的东西,而且并不难。

标签: java linux bash process processbuilder


【解决方案1】:

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

【讨论】:

  • 我认为你是对的。我只需要 `linCmd = {"/bin/bash", "-c", "set +m; shopt -u huponexit; nohup myScript.sh 2>&1 > /dev/null &"};
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多