【问题标题】:Send "sigterm" from Java to Bash script将“sigterm”从 Java 发送到 Bash 脚本
【发布时间】:2016-08-12 22:44:15
【问题描述】:

我正在从名为start.sh 的 Bash 脚本启动 Java 代码。 Bash 脚本启动 Java 代码,然后 Java 代码运行。在 Java 程序结束时,我想向 Bash 脚本发送一个信号以终止。请记住,Bash 脚本以 PID = 1 运行。我必须终止 PID 1 进程。

我设置了 bash 脚本,使其在无限循环中运行,waits 用于终止信号:

#!/bin/bash

# Run the java code here..

# Listen for an exit command.

trap 'exit 0' SIGTERM
while true; do :; done

我正在使用 Docker 实例,信号为 sigterm。我正在关注本教程:https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/,它解释了如何从命令行发送 sigterm。我想自动化这个过程,并在 Java 程序结束后立即从内部关闭/终止 docker 实例。

如何将信号发送回最初启动 Java 代码的 bash 脚本?

我应该跟随吗 this method 将信号作为参数发送到 bash 脚本?或者它会启动另一个具有不同 PID(不是 1)的 bash 脚本。

需要帮助!

【问题讨论】:

  • 使用kill -15 PID
  • 在哪里?在 bash 脚本中?
  • 不抱歉,读错了,就像从 bash 发送到 java 一样。
  • 问题是,我可以轻松地从外部终止(发送 sigterm)到 docker 实例。它会根据需要终止。我只想从 Java 发送它并使其自动化,这样我就不必编写任何 sigterm 命令并继续检查 Java 程序是否已完成

标签: java bash shell docker sigterm


【解决方案1】:
  1. 在 bash 脚本的第二行写入“set -e”。
  2. 不要使用陷阱和while。将其替换为 'exec your_java_code_run'。

通过这种方式docker在java代码运行结束后获取SIGTERM。

示例:

#!/usr/bin/env bash
set -e

someOtherCodeIfNeed

exec your_java_code_run

【讨论】:

  • something like this: #!/bin/bash set -e # 在这里运行java代码.. exec HelloWorld ?
  • #!/usr/bin/env bash set -e someOtherCode exec HelloWorld
  • 当你的_java_code_run完成容器会死掉=)
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多