Я часто сталкиваюсь с одной и той же проблемой. Мой общий рабочий процесс включает тяжелые вычисления в MATLAB. Иногда я непреднамеренно пытаюсь выделить новую переменную, размер которой превышает объем доступной памяти. Система зависает, и мне обычно приходится жестко перезагружать машину, чтобы вернуться к работе. : P
В моем случае, и это звучит так же, как и в вашем, я не был так сильно озабочен ограничением объема памяти, используемой MATLAB до статического количества - меня интересовало отсутствие замороженной машины, и я был готов пожертвовать моим процессом MATLAB, чтобы сохранить отзывчивость системы.
Вдохновленный ответом на этот пост , я написал следующий сценарий (я назвал его watch_memory.sh):
#!/bin/bash
MONITOR=$(free | grep 'buffers/cache:')
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')
MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))
while :; do
if [ "$MEM_PERC" -gt "95" ]
then
kill $1
echo "$1 killed for using too much memory."
exit
fi
sleep 1
MONITOR=$(free | grep 'buffers/cache:')
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')
MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))
done
Этот сценарий каждую секунду проверяет процентное количество свободной памяти. Когда система заканчивается, ваш pid "козла отпущения" (переданный в качестве аргумента скрипту) будет убит.
Без изменения приоритета (аккуратности) скрипта на то, чтобы убить козла отпущения, потребовалось около 10-20 секунд, но он все равно работал. Запуск сценария с отрицательным приоритетом привел к мгновенному уничтожению после нарушения (11916 в этом примере - это идентификатор pid, который я хочу убить, если у меня закончится память):
sudo nice -n -5 bash watch_memory.sh 11916
Следует рассмотреть возможность использования эталонных макросов политики. Используя макросы эталонной политики, вы можете затем использовать макрос manage_files_pattern
, чтобы разрешить полный доступ, например:
manage_files_pattern(my_app_t, my_app_file_t, my_app_file_t)
Существуют также макросы для других часто используемых шаблонов, расположенные в/policy/support
в исходном источнике политики.
Если my_app_t
определяется эталонным модулем политики, скорее всего, уже существует интерфейс, который можно использовать для разрешения доступа. Интерфейсы задокументированы в справочной документации API политики (, предоставленной selinux-policy-doc
пакетом ), а также доступны онлайн (, однако они немного устарели ).
Самый простой способ создать эталонный модуль политики — использовать make-файл в пакете разработки политик SELinux(selinux-policy-devel
или аналогичный )вашего дистрибутива, например:make -f /usr/share/selinux/devel/Makefile my_app.pp
.