bash - 如何检查特定的可执行文件是否具有实时进程
问题描述
我想编写一个脚本,定期检查特定的可执行文件是否具有实时进程,如下所示:
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
}
我很难弄清楚如何检查特定的可执行文件是否具有实时进程。
解决方案
要列出打开文件的所有进程,我们可以使用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
在这种情况下,我搜索python3
为lsof $(which python3)
. 它将在第二个字段中报告 PID。但是当有另一个用户也调用时python3
,lsof
会像前两行一样在 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
-a
AND 操作需要。如果您运行此命令,您将看到一个进程的多个条目,要使它们唯一,请运行
lsof -c java 2> /dev/null | sed 1d | sort -uk2,2
另请注意,用户可能会在他们的路径中运行他们自己的 java,因此您必须决定监控哪一个:java
或/usr/bin/java
.
推荐阅读
- android - 将 Room 和 Content Resolver 数据合并到一个对象中
- c++ - C++ 向量 Lower_bound 函数没有像我想的那样工作
- python - Docker + Google Cloud + chromedriver -> 可执行文件需要在 PATH 中
- java - 使用 Java + Linux 在 Cloud Run 上加载 OpenCV 库
- javascript - 我正在尝试创建一个 discord.js 命令,该命令从 json 文件中获取一行,然后将其发送到用户 DM
- java - 如何修复“数据未保存”?
- typescript - 如何用一种具体类型和一种推断类型定义泛型函数
- excel - 如何修复将数据从一个工作簿复制到另一个工作簿的宏
- java - VSCode 无法导入外部库
- android - 如何解决在 Android 上通过 Firefox 打开 PDF 的问题?