代码之家  ›  专栏  ›  技术社区  ›  Jan Vladimir Mostert

退出Java/Kotlin应用程序时阻止bash脚本死机

  •  0
  • Jan Vladimir Mostert  · 技术社区  · 6 年前

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

    其中script是一个liquidsoap脚本,input是一个传递到脚本中的参数

    通常,它将运行以下内容:

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

    liq

    #!/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 &)
    

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   pjh    6 年前

    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
    

    这个 </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
    

    看到了吗 On writing a Linux shell script to safely detach programs from a terminal Difference between nohup, disown and & 有关的详细信息 .

    如果你没有 at 命令:

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

    这就要求 atd 守护程序正在运行,您有权使用它 Run command 'at' 5 seconds from now 有关的详细信息 .

    从守护进程运行进程的现代方法是使用 systemd-run . 看到了吗 Shutdown, suspend require authentication when scheduled in at 例如使用 系统运行 .