首页 > 解决方案 > 如何检查特定的可执行文件是否具有实时进程

问题描述

我想编写一个脚本,定期检查特定的可执行文件是否具有实时进程,如下所示:

psping [-c ###] [-t ###] [-u user-name] exe-name
-c - limit amount of pings, Default is infinite
-t - define alternative timeout in seconds, Default is 1 sec
-u - define user to check process for. The default is ANY user.

例如,psping java将列出该java命令当前调用的所有进程。

在上面的示例中exe-name,主要目标是计算并回显用户的活动进程数,其可执行文件为。java

我写了一个函数:

perform_ping(){

      ps aux | grep "${EXE_NAME}" | awk '{print $2}' | while read PID
         do
           echo $PID # -> This will echo the correct PID

           # How to find if this PID was executed by ${EXE_NAME}
         done
    fi
    sleep 1
}

我很难弄清楚如何检查特定的可执行文件是否具有实时进程。

标签: bashunixgrep

解决方案


要列出打开文件的所有进程,我们可以使用lsof命令。因为必须打开可执行文件才能运行,我们可能只是lsof用于此目的。

下一个问题是,当我们运行一个 java 文件时,我们只需键入java some_file,如果我们发出lsof java它会冷冷地说,lsof: status error on java: No such file or directory因为java实际上是/usr/bin/java.

要从 to 转换java/usr/bin/java我们可以使用which java,所以命令是:

lsof $(which $EXE_FILE)

输出可能如下所示:

lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
  Output information may be incomplete.
COMMAND PID    USER  FD   TYPE DEVICE SIZE/OFF  NODE NAME
python3 26969  user txt    REG    8,1  4526456 15409 /usr/bin/python3.6

在这种情况下,我搜索python3lsof $(which python3). 它将在第二个字段中报告 PID。但是当有另一个用户也调用时python3lsof会像前两行一样在 stderr 上发出警告,因为它无法读取其他用户信息。因此,我们将命令修改为:

lsof $(which python3) 2> /dev/null

抑制警告。然后我们就快到了:

lsof $(which python3) 2> /dev/null | awk 'NR > 1 { print $2 }'

然后你可以使用read捕捉PID。


编辑:如何列出所有用户的所有进程?

默认情况下lsof不会读取特定文件的进程,但在进一步阅读后man lsof我发现有一些选项可以满足您的需求。

-a 导致列表选择选项被与。

-cc 为执行以 c 字符开头的命令的进程选择文件列表。可以使用多个 -c 选项指定多个命令。

-us 为其登录名或用户 ID 号在逗号分隔的集合 s 中的用户选择文件列表。

因此,您可以使用

lsof -c java

列出由 运行的所有命令java。要查看特定用户,请将-u选项添加为

lsof -a -c java -u user

-aAND 操作需要。如果您运行此命令,您将看到一个进程的多个条目,要使它们唯一,请运行

lsof -c java 2> /dev/null | sed 1d | sort -uk2,2

另请注意,用户可能会在他们的路径中运行他们自己的 java,因此您必须决定监控哪一个:java/usr/bin/java.


推荐阅读