我正在尝试使用 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
返回;在这种情况下,crt0 在 main
返回后立即调用 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/