如何调用 shell 脚本来启动后端 Java 进程?
How can I call a shell script to start a backend Java process?
完成 Jenkins 任务后,我使用 Jenkins 的 post-condition 配置部分执行 Linux shell 脚本。
这个 Linux shell 脚本想要在后端启动一个备用服务并且不能导致 Jenkins 暂停。
我试过用"nohup+&"等,但是不行。
有什么好的方法吗?
Jenkins 可能正在等待一些管道关闭。您的后台进程继承了一些文件描述符,并在运行期间一直保持打开状态。
如果幸运的话,唯一的文件描述符是 0、1 和 2(标准的)。您可能想使用 lsof -p PID
检查后台进程的文件描述符,其中 PID 是进程 ID后台进程。
你应该确保所有这些文件描述符(包括输入和输出)都被重定向到后台进程,所以用类似这样的东西启动它:
nohup daemon </dev/null >/dev/null 2>&1 &
随意将输出定向到 /dev/null
以外的文件,但请确保保持重定向的顺序。顺序很重要。
如果您计划从 Jenkins 作业启动后台进程,请注意 Jenkins 将在构建结束时终止后台进程。请参阅 https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller 了解如何防止这种情况。
我遇到了类似的问题,运行 来自 Jenkins 的 shell 脚本作为后台进程。我使用以下命令修复了它:
BUILD_ID=dontKillMe nohup ./start-fitnesse.sh &
完成 Jenkins 任务后,我使用 Jenkins 的 post-condition 配置部分执行 Linux shell 脚本。
这个 Linux shell 脚本想要在后端启动一个备用服务并且不能导致 Jenkins 暂停。
我试过用"nohup+&"等,但是不行。
有什么好的方法吗?
Jenkins 可能正在等待一些管道关闭。您的后台进程继承了一些文件描述符,并在运行期间一直保持打开状态。
如果幸运的话,唯一的文件描述符是 0、1 和 2(标准的)。您可能想使用 lsof -p PID
检查后台进程的文件描述符,其中 PID 是进程 ID后台进程。
你应该确保所有这些文件描述符(包括输入和输出)都被重定向到后台进程,所以用类似这样的东西启动它:
nohup daemon </dev/null >/dev/null 2>&1 &
随意将输出定向到 /dev/null
以外的文件,但请确保保持重定向的顺序。顺序很重要。
如果您计划从 Jenkins 作业启动后台进程,请注意 Jenkins 将在构建结束时终止后台进程。请参阅 https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller 了解如何防止这种情况。
我遇到了类似的问题,运行 来自 Jenkins 的 shell 脚本作为后台进程。我使用以下命令修复了它:
BUILD_ID=dontKillMe nohup ./start-fitnesse.sh &