gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:24 27 4
gpt4 key购买 nike

我正在尝试使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com