0

我正在处理一个应用程序,它提出了许多单独的进程,当礼貌地询问时,其中一些有时不会消失——通过使用应用程序自己的方式。

这意味着,他们必须被粗鲁地驱逐(用SIGTERM),然后,对于特别顽固的人——残酷地(用SIGKILL)。

麻烦的是找到它们...你如何列出所有进程,考虑给定目录 - 或其子目录 - 它的工作目录(cwd)?

我能想到的最好方法是调用:lsof -b -w -u $(whoami),然后解析最后一列以查找我的目录,然后PID通过sort -u.

有没有更好的?

4

2 回答 2

1

如果您只关心工作目录,则可以使用awk来测试输出的第 4 列是否为cwd. 并且awk还可以检查最后一列,看看它是否在你关心的目录中。

procs=$(lsof -b -w -u $(whoami)  | awk '$4 == "cwd" && $NF ~ /^\/path\/to\/directory(\/|$)/ { print $2 }')

由于每个进程只有一个cwd引用,因此您不需要使用sort -u删除重复项。

于 2021-04-01T00:53:01.887 回答
1

假设一个典型的 linux 环境,其 procfs 文件系统安装在/proc

#!/usr/bin/env bash

# Script takes the desired directory as its argument and prints out
# all pids with that directory or a child directory as their working
# directory (As well as what the cwd is)

shopt -s extglob

dir=${1#/}

for p in /proc/[0-9]*; do
    cwd=$(readlink -m "$p/cwd")
    if [[ ${cwd#/} == $dir?(/*) ]]; then
       printf "%d\t%s\n" "${p#/proc/}" "$cwd"
    fi
done
于 2021-04-01T07:46:28.433 回答