Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何终止bash文件中的进程?(.sh)_Bash - Fatal编程技术网

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

如何终止bash文件中的进程?(.sh),bash,Bash,我正在运行java TCP/IP服务器/客户端设置,需要在一个bash文件中自动执行多个客户端实例,如下所示: javac *.java java Server1 & java Client & java Client & java Client & java Client & java Client & ETC. 如何使它们在完成时全部终止?您可以使用kill并从grep传入pid列表,如下所示: kill `ps -ef | grep 'j

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

javac *.java
java Server1 &

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

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

您可以使用
kill
并从
grep
传入
pid
列表,如下所示:

kill `ps -ef | grep 'java Client' | grep -v grep | awk '{print $3}'`

若您想要正确、安全的作业控制,则需要在后台应用程序的过程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
#/usr/bin/env bash
numclients=5
案件“$1”
开始)
#首先启动服务器。。。
java服务器1&
pid=$!
echo“$pid”>/var/run/Server1.pid
#然后启动客户端。
对于clid,单位为美元(相当于1美元的numclients);做
java客户端&
pid=$!
echo“$pid”>/var/run/client-${clid}.pid
完成
;;
(停止)
#先杀了客户
对于clid,单位为美元(相当于1美元的numclients);做
if[-s/var/run/client-${clid}.pid];然后
kill-TERM$(
我只是写了这个,还没有测试过。如果有与环境有关的拼写错误或不兼容,请随意解决,并考虑上面脚本的脚本:你应该做的一个例子。 请特别注意,
seq
命令在FreeBSD和许多Linux发行版中都可用,但在较旧版本的OSX中不可用。如果你需要的话,有一些简单的选择
jot
可以在OSX或FreeBSD中作为替代品,如果您不需要/不想使用
$numclients
变量,您可以使用
{1..5}
(或其他)来生成“序列表达式”

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

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

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

几乎所有Linux和OS X机器都有
pkill
,它接受字符串并将终止同名进程。

是否需要为每个客户端实例复制该行?否,所有与grep匹配的进程ID都将被终止。它似乎正在工作,端口不再使用,你知道我如何消除这个错误吗?kill:用法:kill[-s sigspec |-n signum |-sigspec]pid | jobspec。。。或者kill-l[sigspec]./BashPart2.sh:line 24:kill:(501)-没有终止这样的进程:15避免grep发现自己的一个好方法是
grep'java Clien[t].
如果您有其他java客户机在运行呢?一个更好的方法是实际跟踪启动的进程,然后只终止您知道需要终止的进程。请参阅我的答案,了解执行此操作的启动/停止脚本的示例。除非您限制组,否则脚本使用根本不安全。它还使系统面临与
ps | grep | grep
解决方案完全相同的风险。如果您正在运行服务器,请将其视为服务器。如果它以
#开头,则仅为bash脚本/bin/bash
。如果它以
#开头/bin/sh
,这是一个POSIX sh脚本。扩展名不足以说明该类型的任何有用信息——您可以将文件命名为
.sh
扩展名,但以
#开头/usr/bin/env-python
,它将是一个python脚本;事实上,更好的做法是完全不在可执行文件上使用文件扩展名(注意运行
ls
,而不是
ls.elf
?)。另一种思考方式是,在Unix和Linux中,没有“扩展”这样的东西。这些都是DOS等过时操作系统的遗留问题,虽然一些现代应用程序理解文件名后缀表示其类型的概念,但这只是为了与那些仍在考虑DOS术语的人兼容。有没有注意到,即使将PNG文件重命名为具有.GIF扩展名,也可以将其加载到图像编辑器中?:)