Как мне запустить ulimit -c unlimited автоматически

Я пытаюсь обеспечить поддержку генерации файла coredump из моего rootfs, я изменил файл / etc / limits с помощью команды «ulimit -c unlimited» и «* hard core -1». Теперь, когда я даю kill -6 $$, ожидая генерация файла ядра, но чтобы получить этот файл ядра, необходимо явно запустить ulimit -c unlimited.

Но я хочу, чтобы это происходило автоматически, не нужно снова запускать ulimit -c unlimited в оболочке.

Кто-нибудь может сказать мне, какие изменения я должен сделать, чтобы то же самое произошло?


person Amit Singh Tomar    schedule 21.08.2013    source источник
comment
Поместите в свой .profile файл?   -  person Nobilis    schedule 21.08.2013
comment
Добавьте строку в файл запуска оболочки, возможно, в ~/.profile.   -  person devnull    schedule 21.08.2013
comment
Может, хотите прочитать это. Похоже, вы могли бы иметь некоторую информацию о том, как создать свой собственный файл профиля.   -  person Nobilis    schedule 21.08.2013
comment
Ну, по указанным причинам не могу поместить его в файл профиля. Если я перейду в файл профиля, это повлияет только на программу, запущенную из оболочки входа в систему, а не на процессы / службы, запущенные systemd. / etc / limits будет правильным местом для настройки этих значений по умолчанию. Об этой причине уже говорилось.   -  person Amit Singh Tomar    schedule 21.08.2013
comment
@Nobilis, не могли бы вы прокомментировать сказанное выше?   -  person Amit Singh Tomar    schedule 21.08.2013
comment
@AmitSinghTomar Насколько я понимаю, поскольку вам все еще нужно запускать ulimit -c unlimited явно (предположительно из командной строки), вы все равно можете использовать его в своем профиле.   -  person Nobilis    schedule 21.08.2013
comment
@Nobils, но будет ли это правдой Это повлияет только на программу, запущенную из оболочки входа в систему, а не на процессы / службы, запущенные системой   -  person Amit Singh Tomar    schedule 21.08.2013
comment
@AmitSinghTomar Если посмотреть на ответ alk, это похоже на способ заставить приложение позаботиться о дампе ядра. Тем не менее, я все еще думаю, что размещение вызова в .profile будет полезным, поскольку вам все равно придется запускать его самостоятельно (судя по всему). Вы, конечно, можете попробовать и посмотреть, работает ли это :)   -  person Nobilis    schedule 21.08.2013


Ответы (1)


В программе вы можете использовать setrlimit(RLIMIT_CORE, ...), чтобы установить максимальный размер файла ядра. Чтобы указать бесконечный размер, пройдите RLIM_INFINITY.

Подробнее об этом читайте здесь: http://manpages.debian.net/cgi-bin/man.cgi?query=getrlimit&sektion=2


Используя команду sysctl, вы можете сделать

sysctl kernel.core_pattern=/var/core/core.%p

чтобы ядро ​​создавало ядра с именами core.<pid> в /var/core.

Добавление kernel.core_pattern=/var/core/core.%p к /etc/sysctl.conf делает его постоянным. (запустите sysctl -p, чтобы обработать изменения в /etc/sysctl.conf)

Помимо %p (для идентификатора процесса) есть другие заполнители, как показано ниже (взято отсюда):

%%  a single % character
%p  PID of dumped process
%u  (numeric) real UID of dumped process
%g  (numeric) real GID of dumped process
%s  number of signal causing dump
%t  time  of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC)
%h  hostname (same as nodename returned by uname(2))
%e  executable filename (without path prefix)
%E  pathname of executable, with slashes ('/') replaced by exclamation marks ('!').
%c  core  file  size soft resource limit of crashing process (since Linux 2.6.24)
person alk    schedule 21.08.2013
comment
Спасибо @alk, я ищу что-то подобное, поэтому мне нужно указать sysctl kernel.core_pattern = / var / cor / core.% P в моем /etc/sysctl.conf ?? и действительно ли мне тогда нужно явно запускать ulimit -c unlimited ?? - person Amit Singh Tomar; 21.08.2013
comment
@AmitSinghTomar: kernel.core_pattern указывает где разместить основной файл и как назвать его. - person alk; 21.08.2013
comment
Отлично @alk, но это не решит мою проблему. Cav мы установили максимальный размер основного файла в файле / etc / limits? - person Amit Singh Tomar; 21.08.2013
comment
@AmitSinghTomar: Вы можете использовать setrlimit() из вашей программы до максимального размера основного файла, как это было предложено в моем ответе. - person alk; 21.08.2013
comment
да @alk, это то, что я ищу. Вы знаете, где в коде Linux он был установлен. - person Amit Singh Tomar; 21.08.2013
comment
@AmitSinghTomar: setrlimit() - это функция C, которую можно вызывать напрямую из вашего кода. Подробнее об этом см. Здесь: manpages.debian.net/ cgi-bin / - person alk; 21.08.2013