概述Java执行运行守护进程脚本的Bash脚本
我正在处理当我的Java服务器应用程序请求重新启动服务器时运行的bash脚本。 该脚本执行需要在Java应用程序的进程树之外的 *** 作。
我用以下方式使用ProcessBuilder在Java中调用重启脚本:
// Vars declared at the top of the file private static final String LOC = \”/some/directory/\”; private static final String RESTART_SCRIPT = LOC + \”restart.sh\”; … // In the function that is invoked to handle reboot behavior final ProcessBuilder pb = new ProcessBuilder(RESTART_SCRIPT); Process p = pb.start();
该脚本执行以下 *** 作来处理另一个处理所有重新启动逻辑的脚本。 它看起来像下面这样:
#!/bin/bash (bash /some/directory/shutdownHandler.sh \”true\” &) exit 0
在Java应用程序中,当我调用包含ProcessBuilder逻辑的函数时,在shutdownHandler.sh脚本中看不到逻辑的效果。 即使是简单的文字回声文件也不会发生。 我已经检查过我有正确的权限。
我将如何获得在bash当前的鼠标坐标?
将由PHP Cli输出的值分配给shellvariables
Unix脚本在每行末尾添加^ M
不能在while循环之外读取存储在while循环中的variables
如何将文件夹中的文件列表发送到linux中的txt文件
当我直接从命令行执行restart.sh时,它按预期工作。
请咨询我为什么看到这种行为差异。 有什么方法Java是杀死守护程序的脚本?
如何用filter链过滤行
合并文件反向
使用BASH显示进度(工作)指标
bash是否有一个caching来记住它上次find的二进制文件的位置?
如何删除名称以“ – ”开头的文件
我建议你尝试下面的简化:
final String[] RESTART_COMMAND = { \”nohup\”,\”/some/directory/shutdownHandler.sh\”,\”true\” }; final ProcessBuilder pb = new ProcessBuilder(RESTART_COMMAND); Process p = pb.start(); //DON\’T waitFor()
使用nohup并避免waitFor应该与RESTART_SCRIPT实现相同的效果:两个进程的生命周期是独立的( jvm不会等待shutdownHandler.sh ,Java进程的终止不会导致shutdownHandler.sh的中断shutdownHandler.sh )。
我找到了一种方法让脚本shutdownHandler.sh在我描述的使用场景中正确触发。 问题在于我如何守护程序shutdownHandler.sh 。 我已经将restart.sh更改为:
#!/bin/bash LOGfile=\”/some/log/directory/scriptLog.log\” (setsID /some/directory/shutdownHandler.sh \”true\” >$LOGfile 2>&1 < /dev/null &) exit 0
以上做了一些关键的事情:
处理脚本的stdout , stderr和stdin 。 stdout和stderr被引导到LOGfile并将dev/null附加到stdin
断开控制tty
将脚本修改为init。 shutdownHandler.sh将不会与JVM在同一个进程树中
总结
以上是内存溢出为你收集整理的Java执行运行守护进程脚本的Bash脚本全部内容,希望文章能够帮你解决Java执行运行守护进程脚本的Bash脚本所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容