gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:25:43 24 4
gpt4 key购买 nike

我正在运行一个 java TCP/IP 服务器/客户端设置,并且需要像这样在 bash 文件中自动化客户端的多个实例:

javac *.java
java Server1 &

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

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

最佳答案

如果您想要适当、安全的作业控制,则需要在后台运行时跟踪后台应用程序的进程 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 变量,您可以通过以下方式创建“序列表达式”使用 {1..5}(或其他)代替。

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

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

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

关于bash - 如何终止 bash 文件中的进程? (.sh),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33945490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com