2

我是 Bash 脚本的新手,但我学得很快。通常。我正在尝试编写一个脚本来杀死并重新启动 Hudson 的一个实例——它需要重新启动以获取环境变量中的更改。到目前为止我所拥有的:

#!/bin/bash
h=`pgrep -f hudson`
if test "$h" != ""; then
  kill $h
  while [ "$h" != "" ]; do
    sleep 1
    unset h
    h=`pgrep -f hudson`
  done
fi
java -jar ~/hudson/hudson.war &

该脚本正确地确定了正在运行的 Hudson 实例的 PID 并将其终止。但是,它只是在“kill”行之后等待并且不会继续。如果我在那里按下一个键,它会完成终止进程并退出脚本,甚至永远不会进入 while 循环。显然,我遗漏了有关如何终止该过程的信息。并不是说Hudson进程挂了,没有响应“kill”;它正常退出,直到我干预。

我也确信这可能会更有效率,但现在我只想了解我哪里出错了。

提前致谢。

4

3 回答 3

4

这代表了对脚本的一些直接改进:

#!/bin/bash
h=$(pgrep -f hudson)    # $() is preferred over backticks
if [[ -n $h ]]; then    # this checks whether a variable is non-empty
  kill $h
  while [[ -n $h ]]; do
    sleep 1
    h=$(pgrep -f hudson)    # it's usually unnecessary to unset a variable before you set it
  done
fi
java -jar ~/hudson/hudson.war &

但是,这很可能就是您所需要的(或使用mroney 提到的提供的工具):

while pkill hudson; do sleep 1; done
java -jar ~/hudson/hudson.war &
于 2010-08-17T02:43:48.127 回答
2

对哈德森好一点,让它自己关闭怎么样。我在Hudson 论坛中找到了以下声明:

我将http://server/hudson/exit添加到 1.161。访问此 URL 将关闭运行 Hudson 的 VM。

您可以使用 wget 调用 URL。如果 Hudson 没有在适当的时间关闭,你仍然可以杀死它。

编辑:我刚刚偶然发现了另一个线程,带有有趣的重启选项。它使用 Winstone 服务器中构建的命令。不确定它是否会接受对环境变量的更改。

于 2010-08-17T14:18:27.873 回答
0

如果您通过 RPM 使用 Hudson,它已经带有一个 init 脚本。如果没有,我会看看它们,看看你是否可以基于它们来编写脚本:https ://hudson.dev.java.net/svn/hudson/trunk/hudson/main/rpm/SOURCES/ (客人//客人)。

于 2010-08-17T00:00:55.537 回答