我正在从Kotlin启动一个击键脚本,但是一旦应用程序退出,就不再运行这个脚本了。

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运行的,而应用程序正在运行,即SurValScript脚本正在运行,一旦我退出CtrLIN应用程序使用Ctrl +C,SurVoScript脚本也将停止。
我的印象是,nohup +cc>会产生一个新的控制台,因此即使在Kotlin应用程序退出之后仍然保持脚本运行,但它不是。
在我的KOTLIN应用程序退出后,如何保持脚本运行的任何想法?

最佳答案

nohup+&不“生成新控制台”。它只是创建一个忽略挂断信号的后台进程。有关更多信息,请参见Wikipedia article on nohup
我不知道为什么杀死应用程序会杀死从它运行的程序,但我可以建议一些尝试。
纳胡尔福伊莱尔建议的双叉是个好主意。正确语法的一个例子是:

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

</dev/null不必与nohup一起使用,但我添加它是为了保持一致性。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

关于java - 退出Java/Kotlin应用程序时,避免bash脚本死亡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52721456/

10-10 00:06
查看更多