pkill 正在等待

pkill 正在等待

是否有类似 pkill 的工具可以执行以下操作:

  1. 向所有匹配进程发送信号
  2. 等待 N 秒直到进程终止
  3. 如果所有进程都终止了,很好:退出
  4. 如果某些进程尚未终止,请发送 SIGKILL

对我来说,重要的是该工具要等到进程真正终止。

我知道用我最喜欢的脚本语言来完成此操作非常容易,但在这种情况下,如果我使用已经存在的工具,那就太好了。

这需要在 SuSE-Linux 和 Ubuntu 上运行。

答案1

没有“标准”命令可以提供您所追求的行为。但是,在 Debian 及其衍生版本上,您可以使用start-stop-daemon--stop操作与--retry选项:

start-stop-daemon --stop --oknodo --retry 15 -n daemontokill

将发送SIGTERM到所有名为 的进程daemontokill,等待最多 15 秒让它们停止,然后发送SIGKILL到所有剩余进程(从初始选择开始),并再等待 15 秒让它们结束。如果没有什么可终止的或所有进程都停止,它将以状态 0 退出;如果第二次超时后某些进程仍然存在,则它将以状态 2 退出。

有许多选项可以以各种方式匹配流程,请参阅文档(上面链接)了解详细信息。您还可以提供具有不同超时的更详细的时间表。

start-stop-daemon是软件包的一部分dpkg,因此它始终在 Debian 系统(及其衍生系统)上可用。一些非.deb发行版也提供该软件包;例如,openSUSE Leap 42有它。在其他平台上构建非常简单:

git clone https://salsa.debian.org/dpkg-team/dpkg.git 
cd dpkg
autoreconf -fi && ./configure && make

你需要autoconfautomakelibtoolgettext。构建完成后,您将start-stop-daemonutils目录中找到。

答案2

您可以使用该timeout命令killall -w

例如:

# timeout 3 killall -vws2 $PROCESS_NAME || killall -vws9 $PROCESS_NAME

timeout3 秒后将“超时”,并退出并显示错误代码,然后您捕获该错误代码||,然后运行killall -s9以强制终止。

答案3

您可以创建自己的脚本来满足您的情况。关注这篇文章无用的使用kill -9和来源真的杀了

#!/bin/sh
#
# $Id: reallykill,v 1.2 2004/10/11 09:36:48 jmates Exp $
#
# The author disclaims all copyrights and releases this script into the
# public domain.
#
# Kills the specified processes by starting with the TERM signal and
# only if necessary working up to the violent KILL signal. For more
# information, see:
#
# http://sial.org/howto/shell/kill-9/

if [ -z "$1" ]; then
  echo "usage: `basename $0` pid [pid ..]" >&2
  exit 100
fi

cycle_kill () {
  PID=$1
  RETVAL=0

  for signal in "TERM" "INT" "HUP" "KILL"; do
    kill -$signal $PID
    RETVAL=$?
    [ $RETVAL -eq 0 ] && break
    echo "warning: kill failed: pid=$PID, signal=$signal" >&2
    sleep 1
  done

  return $RETVAL
}

for pid in "$@"; do
  cycle_kill $pid
done

因此,您只需将脚本下载到您的 bin 目录即可:

 curl http://web.archive.org/web/20080213192428if_/http://sial.org:80/howto/shell/kill-9/reallykill > $HOME/bin/killwait && chmod +x $HOME/bin/killwait

我会这样使用它:

ping -q localhost &
killwait `pidof ping`

也许您想首先更改 INT 信号的顺序,这样您就会得到带有 ping 命令摘要的输出。如果 KILL 信号成功,提供的命令不会等待,但它应该起作用,因为进程将被系统杀死。

相关内容