如何终止bash文件中的进程? (.SH)

时间:2015-11-26 19:03:20

标签: bash

我正在运行java TCP / IP服务器/客户端设置,需要在bash文件中自动执行客户端的多个实例,如下所示:

javac *.java
java Server1 &

java Client &
java Client &
java Client &
java Client &
java Client &
ETC.

完成后如何让它们全部终止?

3 个答案:

答案 0 :(得分:4)

如果您需要正确,安全的作业控制,则需要在后台应用程序中跟踪后台应用程序的进程ID。

您应该考虑使用类似这样的内容作为启动/停止脚本,而不是依赖ps的输出:

#!/usr/bin/env bash

numclients=5

case "$1" in

  start)
    # Start the server first...
    java Server1 &
    pid=$!
    echo "$pid" > /var/run/Server1.pid

    # Then start the clients.
    for clid in $(seq 1 $numclients); do
      java client &
      pid=$!
      echo "$pid" > /var/run/client-${clid}.pid
    done
    ;;

  stop)
    # Kill the clients first
    for clid in $(seq 1 $numclients); do
      if [ -s /var/run/client-${clid}.pid ]; then
        kill -TERM $(< /var/run/client-${clid}.pid)
      fi
    done

    # Then, kill the server
    if [ -s /var/run/Server1.pid ]; then
      kill -TERM $(< /var/run/Server1.pid)
    fi
    ;;

esac

我刚刚写了这个,我还没有测试过。如果您的环境存在拼写错误或不兼容,请随时解决它们,并考​​虑上面的脚本脚本示例您应该做什么。

请注意,特别是,seq命令在FreeBSD和许多Linux发行版中都可用,但不适用于旧版本的OSX。如果您需要,可以选择简单的替代品。 jot可以作为OSX或FreeBSD的替代品,如果您不需要/想要使用$numclients变量,您可以制作一个&#34;序列表达式&#34;通过使用{1..5}(或其他)代替。

此外,在启动和终止应用程序时,您可能还需要考虑许多其他因素。例如:

  • 如果一切都在运行会发生什么?
  • 如果只有服务器或仅客户端已在运行,会发生什么?
  • 如果客户端的错误数量已经在运行,会发生什么?
  • 如果客户端(甚至服务器)死亡会怎样? (提示:查看daemontools等工具。)
  • 如果pid文件过时会怎样?

您的操作系统已使用的工具可能涵盖所有这些条件。您可能希望使用系统脚本作为示例来构建应用程序启动和拆卸脚本。

答案 1 :(得分:1)

几乎所有Linux和OS X机器都有GridLayout,它接受​​一个字符串并将终止相同名称的进程。

答案 2 :(得分:-1)

您可以使用kill并传递来自pid的{​​{1}}列表,如下所示:

grep