我正在从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 terminal和Difference 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/