我正在尝试从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
并且不想用它破坏原始版本。此外nohup
和shopt -u huponexit
可能是多余的,但我已经尝试过,而不是单独使用它们,似乎无法使其正常工作。
有什么想法吗?
答案 0 :(得分:2)
尝试一下,不要在“set + m ...&”附近添加额外的引号通过将整个事物包含在该数组的第三个元素中,你告诉java这整个事情是第三个参数。引号应该是不需要的,我认为它们可能会干扰。
答案 1 :(得分:0)
您是否可以介绍该过程,添加对后台进程disown
的调用,然后让shell退出?
disown [-ar] [-h] [jobspec ...]
如果没有选项,则会从活动作业表中删除每个jobspec。如果给出了-h选项,则不会从表中删除每个jobspec,但会对其进行标记,以便在shell收到SIGHUP时不会将SIGHUP发送到作业。如果不存在jobspec,并且未提供-a和-r选项,则使用当前作业。如果未提供jobspec,则-a选项表示删除或标记所有作业;没有jobspec参数的-r选项将操作限制为正在运行的作业。除非jobspec未指定有效作业,否则返回值为0.