linux - 获得有关进程终止的通知

标签 linux ipc

我正在尝试使用 NETLINK 和 CN_IDX_PROC 来监控我的进程。这可行,但需要以 root 权限启动监控进程。

我试图通过在我的监控可执行文件(包括 CAP_AUDIT_READ、CAP_SYS_ADMIN、CAP_SYS_PTRACE 和 CAP_IPC_OWNER)上设置文件系统的功能来修复它,但它没有用,bind() 仍然失败,提示“不允许操作”除非使用 sudo 开始。

有没有办法让非 root 用户按照我想要的方式使用 netlink 连接器套接字?

如果不是,是否有任何其他可靠的方法可以在其他(非子进程,在不同用户帐户下运行)进程终止时得到通知?我不想投票:它是嵌入式软件,我没有太多资源,我想尽快得到通知。我特别想在目标进程异常终止时得到通知,例如有段错误,所以我不能依赖目标进程的合作。

在 Windows 上,我只是在目标进程中创建并锁定一个命名的互斥量,并让监视进程在其上休眠,保证在所有者进程死亡后立即释放互斥量。 Linux中有没有类似的IPC机制?

最佳答案

因此,您希望收到有关进程终止的通知,例如运行一些程序 foo

顺便说一句,如果该进程运行良好,您可以在 foo 的源代码中使用 atexit(3)。然后,如果该程序正确退出(通过显式调用 exit(3),或从 main 返回;在这种情况下,crt0main 返回后立即调用 exit(3)),注册例程在你想要的时候运行。但是那个 foo 进程可能会被一些 signal(7) 遗憾地终止(例如 segmentation fault ,或者一些外部 kill(1) 命令等等......),那么当然 _exit(2) 不会发生(exit(3) 也不会发生...... ..).

因此,编写一个简单的包装程序(例如 wrapfoo),其中 fork(2) -s 然后是 execve(2) -s foo 在子级中,waitpid(2) 在父级中。然后,您的 wrapfoo 总是收到 foo 结束的通知(包括 foo 被某些信号终止时)。它的行为就好像它是一个专门的“shell”来运行 foo(这只是为了解释这里,wrapfoo 不是真的是 Unix shell ).

(当然,您不希望运行 wrapfoo 的进程自行终止)

wrapfoo 程序的编码非常简单。你应该期望它是正确的。你可以(小心地)使用 setuid 技术让他们使用不同的用户(如果你需要的话)。请注意,setuid 技巧很困难,不小心可以打开 security hole

在某些情况下,您可能会将 wrapfoo 的 C 源代码与 foo 的代码合并,但大多数时候您不想这样做(separation of concerns 原则)。特别是如果您使用危险的 setuid 技术,您希望您的 wrapfoo.c 尽可能简单(并且能够证明它按您希望的方式工作)。

阅读一些关于 Linux 编程的好书,例如下载旧的 Advanced Linux Programming(也是 here ;它可以合法免费下载)或更新的东西。 setuid 技术和 fork(2)execve(2)waitpid(2) ... 背后的所有细节都很难解释(所以我什至不会在这里尝试)。另见 credentials(7)

也许你可以使用 fifo(7) ,使用一些建议锁定(例如 flock(2)lockf(3) ...);当进程终止时,内核也会释放它们。

关于linux - 获得有关进程终止的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237037/

相关文章:

linux - 在 Ubuntu 10.04(64 位机器)上访问物理内存时 PC 完全死机

c++ - 进程间 Hook

c++ - 我如何与 C++ 中的其他应用程序交互?

c# - 两个 C# exe 之间的通信

linux - 接受可选参数的 Shell 脚本

c - 创建了多少进程

linux - 我可以在MacOS的_start处通过代码执行 `ret`指令吗? Linux的?

c - 使用哪个IPC我可以将文件描述符从一个进程传递到同一台机器上的另一个进程?

python - 简单(但具体)的监听器和发送器 Python 3 DBus 示例

linux - Debian 分区 - 数据库在哪个分区?