如何在Linux下以编程方式可靠地获取与具有给定pid的进程相对应的可执行路径?

西蒙兹

在Linux下从用户模式应用程序中按进程名称实现筛选的最佳方法是什么?

我知道的所有方法都依赖于阅读proc_fs:

  1. 阅读链接开启 /proc/$PID/exe
  2. 从读取/proc/$PID/cmdline,直到第一个空字符
  3. 解析名称字段 /proc/$PID/status

如果与方法3结合使用,第一种方法似乎是可靠的。不幸的是,(deleted)当从系统中删除可执行文件时,路径会带有后缀,该后缀可以是普通文件名的后缀部分。如果将此类名称用于可执行文件,则过滤器将不可靠。

第二种方法取决于启动该过程的外壳。这只是该过程的第一个参数(位置0),对于IIUC,shell可以自由地对其进行适当设置。例如,bash将破折号加在登录shell之前。

第三种方法依赖于直接从内核task_struct中的字段获取的,被截断为15个字符的名称。这显然不是很可靠,但它是内核进程可用的唯一名称,因此必须补充其他两个名称。(显然,如果名称包含非ASCII字符,它们将显示为转义序列,因此该方法是可靠的。)

总而言之,我无法提出一种鲁棒的,与Shell无关的方法来支持按进程可执行文件名(或理想的路径)进行过滤,允许使用任意文件名。我可能会使用cmdline中的领先命令参数,因为它可能符合我的目的,但是我想确保自己了解可用的选项。

注意:安全性虽然是一个问题,但却是另一回事。如果需要安全性,将检查该过程的用户身份。但是我希望名称过滤器只是正确性。目的是可靠地实现服务质量或每个进程的配置,并且将涉及进程名称过滤。

用户名

/proc/$PID/exe通过对stat链接本身和readlink的结果进行一对s可以提高第一种方法(readlink 的鲁棒性如果您获得匹配的st_devst_ino,则它们是同一文件。如果没有找到匹配项,或者没有得到ENOENT,请检查" (deleted)"字符串的末尾,将其剥离,然后重试。重复直到获得匹配项或" (deleted)"实例用完

如果您在所有这些之后都没有找到匹配项,则说明该可执行文件确实已被删除。(在这种情况下,您还没有真正指定要执行的操作,这是您绝对应该考虑的。在坚持健壮性的同时,您不能仅仅忽略删除文件可以使用的事实!)

stats之间仍然存在竞争条件,因此您可能想同时打开两个文件和fstat它们。然后,如果获得设备+节点的匹配,则可以使用一个文件描述符,可以确信它实际上属于目标进程中执行的文件,而不是具有类似名称的其他文件。

下一个困难是,如果过程本身在测试过程中消失了,并且PID被重用了。如果您对此/proc/$PID/stat有所担心,则可以从操作的开始和结束读取过程的开始时间,以确保整个过程中都在处理相同的过程。(此外,还有一种防止进程消失的方法:使用ptrace作为调试器附加到该进程。)

然后是一个问题,如果您在查看过程时该进程执行了另一个程序,您想做什么。/proc/$PID/exe将改变。如果您的最终一致性检查后立即发生,你将返回的值正确的,但现在不是了。除了ptrace之外,您对此无能为力,而且比您想要的更具侵入性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过此pid执行的文件获取pid及其可执行路径信息?

来自分类Dev

如何从.desktop文件中的可执行路径获取期望的进程名称

来自分类Dev

在solaris上如何以编程方式获取正在运行的进程的可执行文件的完整路径?

来自分类Dev

如何在javascript中不带后缀的情况下可靠地获取文件名?

来自分类Dev

如何在Linux下可靠地确定文件系统类型?

来自分类Dev

C#:如何获取给定无路径文件时Process.Start将使用的可执行路径?

来自分类Dev

C#:如何获取给定无路径文件时Process.Start将使用的可执行路径?

来自分类Dev

如何编写一个可靠地退出(具有指定状态)当前进程的函数?

来自分类Dev

如何找到php的可执行路径?

来自分类Dev

在C中给定父PID的情况下如何获取所有子进程的PID

来自分类Dev

如何可移植且可靠地将相对路径转换为绝对路径?

来自分类Dev

通过可执行路径限制进程的CPU时间

来自分类Dev

如何在PATH上可靠地找到程序的完整路径?

来自分类Dev

如何在PATH上可靠地找到程序的完整路径?

来自分类Dev

在C#中,如何可靠地杀死进程树

来自分类Dev

在C#中,如何可靠地杀死进程树

来自分类Dev

nodejs应用程序如何在特定时间可靠地执行任务?

来自分类Dev

Bash选项获取已解析的可执行路径?

来自分类Dev

在 C++ 中使用 AssocQueryString 获取可执行路径

来自分类Dev

如何通过 KafkaConsumer 可靠地获取所有 kafka 主题消息

来自分类Dev

如何在Emacs的配置文件上为程序包设置可执行路径?

来自分类Dev

C++ Windows - 通过可执行文件路径获取进程的 PID

来自分类Dev

如何使Linux在多CPU机器上可靠地启动?

来自分类Dev

如何在C#中可靠地检查null

来自分类Dev

如何可靠地将/ proc / pid / environ转换为env命令的参数?

来自分类Dev

Windows Update可执行路径

来自分类Dev

如何在Linux中的C中获取PID的所有后代子进程ID

来自分类Dev

在Swift中可靠地获取iOS应用程序的“〜/ Library”路径

来自分类Dev

Linux:/ proc / <PID> / exe返回可执行文件'/ bin / bash'的路径,用于位于'/ home / <USER> / new / v'的进程

Related 相关文章

  1. 1

    如何通过此pid执行的文件获取pid及其可执行路径信息?

  2. 2

    如何从.desktop文件中的可执行路径获取期望的进程名称

  3. 3

    在solaris上如何以编程方式获取正在运行的进程的可执行文件的完整路径?

  4. 4

    如何在javascript中不带后缀的情况下可靠地获取文件名?

  5. 5

    如何在Linux下可靠地确定文件系统类型?

  6. 6

    C#:如何获取给定无路径文件时Process.Start将使用的可执行路径?

  7. 7

    C#:如何获取给定无路径文件时Process.Start将使用的可执行路径?

  8. 8

    如何编写一个可靠地退出(具有指定状态)当前进程的函数?

  9. 9

    如何找到php的可执行路径?

  10. 10

    在C中给定父PID的情况下如何获取所有子进程的PID

  11. 11

    如何可移植且可靠地将相对路径转换为绝对路径?

  12. 12

    通过可执行路径限制进程的CPU时间

  13. 13

    如何在PATH上可靠地找到程序的完整路径?

  14. 14

    如何在PATH上可靠地找到程序的完整路径?

  15. 15

    在C#中,如何可靠地杀死进程树

  16. 16

    在C#中,如何可靠地杀死进程树

  17. 17

    nodejs应用程序如何在特定时间可靠地执行任务?

  18. 18

    Bash选项获取已解析的可执行路径?

  19. 19

    在 C++ 中使用 AssocQueryString 获取可执行路径

  20. 20

    如何通过 KafkaConsumer 可靠地获取所有 kafka 主题消息

  21. 21

    如何在Emacs的配置文件上为程序包设置可执行路径?

  22. 22

    C++ Windows - 通过可执行文件路径获取进程的 PID

  23. 23

    如何使Linux在多CPU机器上可靠地启动?

  24. 24

    如何在C#中可靠地检查null

  25. 25

    如何可靠地将/ proc / pid / environ转换为env命令的参数?

  26. 26

    Windows Update可执行路径

  27. 27

    如何在Linux中的C中获取PID的所有后代子进程ID

  28. 28

    在Swift中可靠地获取iOS应用程序的“〜/ Library”路径

  29. 29

    Linux:/ proc / <PID> / exe返回可执行文件'/ bin / bash'的路径,用于位于'/ home / <USER> / new / v'的进程

热门标签

归档