是否有类似 pkill 的工具可以执行以下操作:
- 向所有匹配进程发送信号
- 等待 N 秒直到进程终止
- 如果所有进程都终止了,很好:退出
- 如果某些进程尚未终止,请发送 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
你需要autoconf
,automake
,libtool
,gettext
。构建完成后,您将start-stop-daemon
在utils
目录中找到。
答案2
您可以使用该timeout
命令killall -w
例如:
# timeout 3 killall -vws2 $PROCESS_NAME || killall -vws9 $PROCESS_NAME
timeout
3 秒后将“超时”,并退出并显示错误代码,然后您捕获该错误代码||
,然后运行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 信号成功,提供的命令不会等待,但它应该起作用,因为进程将被系统杀死。