Выполненный ulimit -c 1073741824
до запуска программы. В следующий раз катастрофические отказы программы, дамп ядра будет создан в рабочем каталоге (названный core.<PID>
). Можно затем использовать GDB для открытия этого ядра в любое время, Вам нравится.
ulimit -c XXXXX
устанавливает максимальный размер файла дампа ядра, созданного, когда программа seg дает сбой. По умолчанию это 0
что означает не выводить ядро.
Учитывая, что Вы будете использовать своего рода диспетчер пакетов для установки библиотек, разве не было бы намного легче просто иметь список пакетов, что Вы хотите быть установленными и гарантировать так или иначе, что они установлены?
100% диспетчеров пакетов, которые я знаю, имеют своего рода режим (режим по умолчанию, обычно), что любой устанавливают пакет, если он не установлен, обновления это к последней версии, если он установил, но старый и просто передает, если это уже актуально.
Например, с apt-get
можно всегда делать apt-get install a b c d ...
для проверки это упаковывает a
, b
, c
, d
установлены. С yum
это было бы yum install a b c d
, и т.д.
При использовании различных систем с различными диспетчерами пакетов в VPSes Вы закончите с записью некоторой логики для обнаружения, который делает диспетчер пакетов это использует так или иначе, таким образом, этот шаг неизбежен.
После выполнения команды ldd, как Вы предположили, можно попытаться использовать что-то как
grep "not found" /tmp/lddcheck | awk '// { print $1 }'
получить названия недостающих библиотек.
awk '/not found/ {print $1}' /tmp/lddcheck
. Или grep 'not found' /tmp/lddcheck | cut -d' ' -f1
– Michael Mrozek♦
12.01.2012, 05:59
Принятие библиотек, Вы нуждаетесь в поддержке он, необходимо использовать pkg-config
, это - то, для чего это сделано.
$ pkg-config --exists libnotify
$ echo $?
0
$ pkg-config --exists nonexistant
$ echo $?
1
$
Вы можете использовать его, чтобы проверить версию, сказать Вам включение или освобождаете пути и т.д.
ldd $YOURBINARY 2>&1 |grep "missing"
должен произвести недостающие библиотеки для Вашего двоичного файла.
Если Вы плохо знакомы со сценариями, помните это: Вам редко нужен временный файл; когда необходимо сделать несколько этапов обработки на некоторых данных, достигнуть канала. Существует много инструментов обработки текста, из которых можно использовать на выводе ldd
. Здесь, я буду использовать awk
, обнаружить строки, где третье разделенное от пробела поле not
(в противоположность пути к библиотеке), и печать первое поле (название библиотеки). Я собираю вывод в переменную, которая будет содержать разделенный от пробела список недостающих библиотек.
missing=$(ldd /path/to/executable | awk '$3 == "not" {print $1}')
for x in $missing; do
# whatever it takes to install $x
done
Обратите внимание, что это - вероятно, не правильный подход. Если Вы собираетесь иметь поддержку определенных дистрибутивов, то не делайте универсальный двоичный пакет с пользовательским взаимодействием с диспетчером пакетов. Распределите пакет для того распределения.
Диспетчеры пакетов делают жизнь системных администраторов намного легче; проигрывание хорошо с диспетчером пакетов оставит Ваших пользователей смущенными и сердитыми. Если Вы распределите rpms и debs и так далее, то Ваши пользователи должны будут просто установить зависимости Вашего пакета. Таким образом, Ваш пакет будет зарегистрирован и может быть установлен, обновлен и удалил использование обычного инструмента управления пакета пользователя, а не путем выполнения некоторого сомнительного сценария.