«Трубный» шаблон ядра не создает дампов ядра внутри контейнера docker - PullRequest
1 голос
/ 30 января 2020

Рассмотрим этот простой «переданный по конвейеру» основной шаблон:

vagrant@myhost:~$ cat /proc/sys/kernel/core_pattern                        
|/var/core-manager.sh %t

с таким же упрощенным сценарием основного менеджера:

vagrant@myhost:~$ cat /var/core-manager.sh 
#!/bin/bash
(
  file=/tmp/mycore.$1
  cat > $file < /dev/stdin
)

Теперь воспроизведите и извлеките дамп ядра в linux host:

vagrant@myhost:~$ ls -lrt /tmp/mycore*
total 0
vagrant@myhost:~$ ulimit -c unlimited
vagrant@myhost:~$ sleep 100 &
[1] 16647
vagrant@myhost:~$ kill -SIGSEGV 16647
[1]+  Segmentation fault      (core dumped) sleep 100
vagrant@myhost:~$ ls -lrt /tmp/mycore*
-rw-rw-rw- 1 root root 385024 Jan 28 18:42 /tmp/mycore.1580233332

Теперь воспроизведите его внутри контейнера, скажем, busybox:

(основной шаблон, как многие из вас могут знать, наследуется контейнером, и хотя ulimit - нет, потому что это зависит от вызывающей оболочки, вероятно, «unlimited» - это значение по умолчанию в оболочках busybox, потому что дело в том, что у меня есть неограниченный ulimit для размера ядра внутри контейнера, делающего «ничего», и это то, что я на самом деле хочу) .

vagrant@myhost:~$ docker run -it --rm busybox
/ # cat << EOF > /var/core-manager.sh
> #!/bin/bash
> (
>   file=/tmp/mycore.$1
>   cat > $file < /dev/stdin
> )
> EOF
/ # chmod a+x /var/core-manager.sh
/ # cat /proc/sys/kernel/core_pattern
|/var/core-manager.sh %t
/ # ulimit -c
unlimited
/ # sleep 100 &
/ # kill -SIGSEGV %1
/ # 
[1]+  Segmentation fault (core dumped) sleep 100
/ # ls -lrt /tmp/mycore*
ls: /tmp/mycore*: No such file or directory

Я добавил + x разрешений к скрипту главного менеджера, на всякий случай, однако я не думаю, что это необходимо (я заблудился относительно того, насколько асинхронные системные задачи, такие как дамп ядра) ведут себя). В любом случае, как вы можете видеть, дамп ядра не создается .

Регулярное расположение пути для шаблона ядра прекрасно работает в контейнерах (конечно, на хосте), тогда это заставляет меня думать, что что-то в docker ограничивает использование этого типа «пипетированных» шаблонов ядра. Или, может быть, это то, чего я сейчас не вижу.

Есть идеи? Большое спасибо!

...