【问题标题】:Stop bash script from dying when exiting Java / Kotlin application退出 Java / Kotlin 应用程序时停止 bash 脚本死亡
【发布时间】:2018-10-09 12:47:19
【问题描述】:

我正在从 Kotlin 启动一个 bash 脚本,但是一旦 Kotlin 应用程序退出,bash 脚本就会停止运行。

val pr = ProcessBuilder("/home/vlad/liq", script, input).start()

其中 script 是一个 Liquidsoap 脚本,而 input 是传递给脚本的参数

通常,它会运行如下内容:

./liq blah.liq http://somedomain.com:8090

liq 然后执行作为第一个参数的liquidsoap 脚本,然后将第二个参数用作liquidsoap 脚本的参数。

#!/bin/bash

nohup /usr/bin/liquidsoap $1 -- $2 > /dev/null 2>&1 &

# this causes syntax error
# nohup (/usr/bin/liquidsoap $1 -- $2 > /dev/null 2>&1 &)

这个 Kotlin 应用程序通过java -jar dashboard.jar 运行,当应用程序运行时,liquidsoap 脚本正在运行,只要我使用 Ctrl + C 退出 Kotlin 应用程序,liquidsoap 脚本也会停止。

我的印象是nohup + & 会产生一个新的控制台,从而即使在 Kotlin 应用程序退出后也能保持脚本运行,但事实并非如此。

关于如何在我的 Kotlin 应用程序退出后保持脚本运行的任何想法?

【问题讨论】:

  • 你可以尝试使用双叉在命令周围加上括号和 apersand (/usr/bin/liquidsoap $1 -- $2 > /dev/null 2>&1 &)
  • 这会导致在意外标记/usr/bin/liquidsoap' 附近出现语法错误,我也尝试将& 符号移出括号,仍然显示语法错误。
  • 抱歉,如果没有 nohup 就不够清楚
  • 基本上,这是整个脚本:/usr/bin/liquidsoap $1 -- $2 其中 $1 是 .liq 脚本,$2 是 URL

标签: java linux bash kotlin


【解决方案1】:

nohup + & 不会“生成新的控制台”。它只是创建一个忽略挂断信号的后台进程。请参阅Wikipedia article on nohup 了解更多信息。

我不知道为什么杀死应用程序会杀死从中运行的程序,但我可以建议一些尝试。

Nahuel Fouilleul 建议的双叉是个好主意。正确语法的一个例子是:

( nohup /usr/bin/liquidsoap $1 -- $2 </dev/null >/dev/null 2>&1 & )
sleep 1 # Wait to ensure that 'nohup' takes effect

nohup 不需要&lt;/dev/null,但为了保持一致,我添加了它。 sleep 1 是为了避免前台和后台进程之间可能出现的竞争条件。

如果这不起作用,setsid 命令(如果你有的话)可以通过将子进程放在单独的进程组和会话中来进一步将子进程与其父进程隔离。示例用法是:

( setsid /usr/bin/liquidsoap $1 -- $2 </dev/null >/dev/null 2>&1 & )
sleep 1 # Wait to ensure that 'setsid' takes effect

有关setsid 的更多信息,请参阅On writing a Linux shell script to safely detach programs from a terminalDifference between nohup, disown and &

如果您没有setsid,或者它没有帮助,下一个选项是使用守护程序来运行命令(使其与设置它运行的进程完全无关)。执行此操作的传统方法是使用 at 命令:

echo "/usr/bin/liquidsoap $1 -- $2" | at now

这要求atd 守护程序正在运行并且您有权使用at。有关at 的更多信息,请参阅Run command 'at' 5 seconds from now

从守护进程运行进程的现代方法是使用systemd-run。有关使用 systemd-run 而不是 at 的示例,请参阅 Shutdown, suspend require authentication when scheduled in at

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2011-04-05
    • 2021-03-04
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多