我需要能够收集核心转储,但由于 Asterisk 的 CWD 是 /(procfs 声称如此),它永远无法写入它们。我通过允许 world 写入 / 和 SIGABRT 进程证实了我的怀疑,瞧,我有一个核心。
我显然可以使用 core_pattern 来覆盖整个系统,但我更喜欢将核心转储到 cwd 的默认行为。我处理过的其他所有 Asterisk 安装,cwd 都是 /tmp,但出于某种原因,这个新安装的 cwd 是 /。我尝试在 Asterisk 服务启动脚本中“cd /tmp”,但没有任何效果。
这是 Debian 7.1 上的 Asterisk C.3.7.2,源中没有专门将其设置为 / 的 chdir()。
答案1
与许多守护进程一样,Asteriskchdir('/')
在将自身转变为守护进程时会执行操作。
main/asterisk.c
3675: if (chdir("/")) {
这是为了确保它不会保持打开您稍后可能要删除的目录。为了防止 asterisk 这样做,您需要使用 在前台运行 asterisk asterisk -f
。
虽然没有记录,但该-g
标志也有不更改目录的效果。其文档中写道:
-g Remove resource limit on core size, thus forcing Asterisk to
dump core in the unlikely event of a segmentation fault or abort
signal. NOTE: in some cases this may be incompatible with the
-U or -G flags.
通过阅读源代码,我发现它还可以防止chdir("/")