Мне нужно иметь возможность собирать дампы ядра, но поскольку CWD Asterisk - это / (так заявляет procfs), он никогда не сможет их записать. Я подтвердил свои подозрения, разрешив миру писать в / и SIGABRT процесс, и вот, у меня было ядро.
Я, очевидно, могу использовать core_pattern для переопределения общесистемной функции, но мне больше нравится поведение по умолчанию - выгрузка ядра в cwd. Каждая другая установка Asterisk, над которой я работал, cwd - это / tmp, но по какой-то причине эта новая - это /. Я попытался ввести cd / tmp в скрипт запуска службы Asterisk, но ничего не произошло.
Это Asterisk C.3.7.2 в Debian 7.1, в исходном коде нет chdir (), который специально устанавливает его в /.
Asterisk, как и многие другие демоны, chdir('/')
при превращении себя в демона.
main/asterisk.c
3675: if (chdir("/")) {
Это сделано для того, чтобы убедиться, что каталог не остается открытым, который вы, возможно, захотите удалить позже. Чтобы звездочка не делала этого, вам нужно будет запустить звездочку на переднем плане, используя asterisk -f
.
Хотя это не задокументировано, -g
flag также не меняет каталог. В его документации говорится:
-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("/")