当特定进程启动时如何运行命令挂钩?

当特定进程启动时如何运行命令挂钩?

假设特定进程是一个长时间运行的后台进程 A。我想在进程 A 启动后立即执行进程 A 的 bash 脚本命令/脚本挂钩,例如获取其 pid 并用它做一些事情。我的用例的问题是我无法控制进程 A 何时/如何启动,并且我无法更改进程 A 来生成 pidfile;因此就有了钩子的想法。

目前,进程 A 可以运行多次,因此可以有多个与进程 A 关联的 pid。脚本挂钩应该在进程 A 的每个实例上运行,而不仅仅是第一次运行。

我尝试使用 cron 和 pgrep 来获取进程 A 的所有实例。但是,这种方法有 60 秒的延迟,因为这是 cron 的最短轮询间隔时间。

我的问题:

  1. 每当启动新进程 A 并可靠地执行进程 A 的 bash hook 时,我有哪些选项可以实现近乎实时的通知(< 5 秒延迟是可以接受的,越低越好)?
  2. 在 bg 中以较低的延迟(例如:1-5 秒睡眠)运行无限 while 循环 + pgrep 是一个安全的选择吗?
  3. 由于 inotify 存在于文件事件中,是否有任何类似的机制来监听(+运行 cmd hook)特定的进程事件(例如:started/killed/proc 状态更改)?

谢谢!

答案1

唯一可靠的解决方案是安排通过包装脚本运行程序。有很多不同的方法可以做到这一点,但没有一种方法适用的情况很不寻常。

  • 配置或修改调用此程序的程序来运行您的包装器。
  • 将同名的包装器放在$PATH.
  • 重命名该程序并为包装器指定其原始名称。

这种方法可以保证您的包装器能够运行,并且如有必要,它有机会在运行实际程序之前进行准备。包装器还能够成为真实程序的父进程,这使得它可以在程序死亡时可靠地收到通知并获取其退出状态。

您可以使用记录文件系统监视文件系统上的事件。看LoggedFS 配置文件语法有关其配置文件的文档。指向loggedfs包含可执行文件的目录。请注意,您需要拥有它或以 root 身份运行 Loggedfs。每次执行一个文件时,都会有一个open事件,您可以获取该进程的 PID。请注意open,如果打开文件进行读取,也会发生一个事件;我认为您无法单独使用 LoggedFS 来区分执行事件。当进程退出时,就会产生一个release事件。请注意,当您的监视代码运行时,该进程可能已经死亡。

在Linux下,你可以使用inotify等待等待可执行文件上的access或事件,例如。每当文件执行时都会发生一个事件,当进程终止时也会发生一个事件。您无法通过这种方式获取进程 ID,因此您必须找出哪些进程打开了该文件(例如使用或),然后过滤正在执行该文件的进程。close_nowriteinotifywait -m -e access,close_nowrite --format=%e /bin/lsaccessclose_nowritefuserlsof

Linux 还有一个更精确的工具,可以让您监视事件(例如特定文件的执行)并报告导致该事件的 PID:审计子系统。看有没有一种简单的方法来记录所有执行的命令,包括命令行参数?。然后您可以使用奥迪SPD当审核事件发生时运行自定义程序。不过,所有这些都需要 root 权限,如果您是 root 权限,那么您可能可以替换可执行文件,而您就不需要这个了。

相关内容