在我们的集群中,我们限制了我们的进程资源,例如内存 ( memory.limit_in_bytes
)。
我认为,这最终也是通过 Linux 内核中的 OOM 杀手来处理的(通过阅读源代码看起来是这样)。
有没有办法在我的进程被杀死之前获得信号?(就像SGE 的-notify
选项一样,它将在进程终止qsub
SIGUSR1
之前发送。)
我在/dev/mem_notify
这里读到,但我没有 - 现在还有别的东西吗?我也读过这似乎有些相关。
我希望能够至少转储一个小的堆栈跟踪和其他一些有用的调试信息 - 但也许我什至可以通过释放一些内存来恢复。
我目前使用的一种解决方法是这个小脚本,它经常检查我是否接近 (95%) 限制,如果是,它会向进程发送一个SIGUSR1
. 在 Bash 中,我在后台 ( cgroup-mem-limit-watcher.py &
) 中启动此脚本,以便它监视同一 cgroup 中的其他 proc,并在父 Bash 进程终止时自动退出。
在我的情况下,似乎LD_LIBRARY_PATH
设置为空字符串。但是所有标准系统工具仍然可以正常工作,所以我猜动态链接器会检查这种情况并LD_LIBRARY_PATH
在这种情况下使用一些默认值。
这个默认值是多少?我想它至少包括/usr/lib
但还有什么?有没有什么好的系统方法来确定动态链接器将搜索的标准位置?
这个问题与动态链接器将搜索的路径略有不同。 有一个默认值意味着它会使用LD_LIBRARY_PATH
如果给定的值,或者如果没有给定,它将使用默认值 - 这意味着它不会使用如果LD_LIBRARY_PATH
提供了默认值。
我没有在手册页中找到有关以下内容的内容。子进程中的假定行为如何由本身产生的进程产生stdbuf
?
例如:
stdbuf -oL myprog
Run Code Online (Sandbox Code Playgroud)
从代码中,我知道它设置了LD_PRELOAD
,据我所知,所有的环境变量都是在任何子进程中继承的。
我对两者fork();
和fork(); execv();
子流程都感兴趣。(不确定这是否会有所作为。)
fork();
根本不应该改变行为。execv()
将使用相同的LD_PRELOAD
(以及也存储在 env 中的 stdbuf 设置)并因此应用相同的行为(来自示例:stdout 是行缓冲的)。
对?