AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 419284
Accepted
guettli
guettli
Asked: 2018-01-25 00:38:25 +0800 CST2018-01-25 00:38:25 +0800 CST 2018-01-25 00:38:25 +0800 CST

等待的 pkill

  • 772

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

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

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

我知道用我最喜欢的脚本语言很容易做到这一点,但在这种情况下,如果我使用已经存在的工具会非常好。

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

command-line kill
  • 3 3 个回答
  • 3133 Views

3 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-01-25T01:02:04+08:002018-01-25T01:02:04+08:00

    没有提供您所追求的行为的“标准”命令。但是,在 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目录中找到。

    • 9
  2. Rabin
    2018-02-12T14:26:46+08:002018-02-12T14:26:46+08:00

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

    例如:

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

    timeout将在 3 秒后“超时”,并以错误代码退出,然后你会抓住它||,然后运行killall -s9以强制杀死。

    • 6
  3. Neurootic
    2018-02-09T07:53:31+08:002018-02-09T07:53:31+08:00

    您可以创建自己的脚本来满足您的情况。按照这个帖子无用的使用 kill -9和 source reallykill

    #!/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 信号成功,则提供的命令不会等待,但它应该可以工作,因为进程将被系统杀死。

    • 2

相关问题

  • 远程运行 X 应用程序,在远程主机上运行 GUI [关闭]

  • 默默杀死subshel​​l?

  • 从后台进程退出脚本?

  • 使 mysql CLI 以交互方式向我询问密码

  • 没有服务器的命令行 pub/sub?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve