【问题标题】:Is there a way to kill all processes that are running in/from a certain directory?有没有办法杀死在某个目录中/从某个目录运行的所有进程?
【发布时间】:2018-03-16 12:17:25
【问题描述】:

我需要一种方法来杀死当前目录中正在运行的所有内容。我对shell有点陌生,所以请原谅我愚蠢或可能不理解您的答案。我有一个不错的理解,但如果您愿意花额外的时间来解释您对我的问题的解决方案到底是什么,我们将不胜感激。

【问题讨论】:

  • 使用lsof 列出它们。
  • 有没有办法杀死它们,或者将进程设置为变量?
  • 顺便说一句——如果你的目标是杀死一个进程及其所有子进程,我个人会创建并使用一个显式的锁定文件。也就是说,在启动程序之前exec 3>file.lck,然后fuser file.lck 来识别以后使用它的任何东西。 fuser 是否将目录中的存在视为具有目录的句柄并没有被 POSIX 很好地指定,并且在操作系统之间有所不同。 (适用于 MacOS,但我的测试并不全面)。
  • ...尽管如果您的目标是执行繁重的流程监督,那么正确的做法是使用您的操作系统提供的东西。例如,如果你在 Linux 上,像 systemd 这样可以利用 cgroups 的东西在提供每个进程树的配额、控制和管理方面会做得更好。
  • @CharlesDuffy 这是特定于游戏服务器的。我想要一个脚本,它可以杀死在每个游戏服务器的根目录中运行的所有进程,无论格式如何。

标签: linux bash shell kill-process working-directory


【解决方案1】:

lsof /path/to/directory | awk '{ print $2 }' | xargs kill

lsof /path/to/dir 命令列出了相对于路径运行的进程。您可以在 shell 上单独运行此命令来亲自查看。

awk '{ print $2 }' 部分,仅清除那些进程的 PID

xargs 帮助将 PID 列表排列成水平列表,然后交给 kill 命令。

【讨论】:

    【解决方案2】:

    短语“在目录中运行”可能有不同的解释方式,其中一些是: (1) 程序是从这个目录启动的, (2) 程序将此目录用作工作目录,或 (3) 程序以任何方式访问该目录。

    很可能你有问题(3)并且已经给出了答案:使用

    $ fuser -k

    但要小心,它可能会杀死比预期更多的人!

    对于问题(1)我会搜索进程环境

    $ grep -l "/home/用户名/目录" /proc/*/environ | grep -o [0-9]*

    并杀死产生的进程。

    【讨论】:

      【解决方案3】:

      你必须使用lsof 命令然后参数将是你要杀死进程的目录

      #!/usr/bin/env bash                                                                                                                                 
      lsof $(pwd) | \                                                           
          awk -F " " ' { print $2 } ' | \                                       
          while read process ; do                                               
             [[ ${process} == "PID" ]] && continue;
                # kill the processes here
                # if you assign each process to a variable or an array
                # you will not be able to access it after leaving this while loop
                # pipes are executed as subshells
                echo ${process};                                                 
           done
      

      【讨论】:

      • 为什么要自己动手而不是使用fuser -k
      • @CharlesDuffy 不熟悉大多数 linux 命令,谢谢,现在我知道这个存在
      • (顺便说一句,使用"$PWD" 更好——比$(pwd) 更有效正确)。
      • @0.sh - 实际上,fuser 命令是POSIX.1 的一部分,所以它不仅仅是一个 linux 命令。在您学习的过程中,请记住,世界不仅仅是 Linux。编写工具时,请考虑是否要努力使它们具有可移植性。
      • (如果它不会让我听起来像一个伪君子,因为它对无法正确处理异常但合法的文件名的程序采取一致的强硬态度是错误的,我也会受到诱惑争论那些忽略 POSIX 指导的人坚持使用小写字符来命名应用程序定义的变量的人应该得到他们所得到的)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2020-10-06
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多