У меня есть несколько серверов, которые начали убивать свои процессы резервного копирования, и, хотя я понимаю, что столкновение с условием oom само по себе довольно плохо, мне нужно, чтобы этот процесс не die, чтобы резервное копирование выполнялось правильно, пока проблема с памятью решена.
С этой целью я попытался создать способ запуска процессов с настроенными oom_scores способом, похожим на запуск процесса с nice
.
#!/bin/bash
function oom_adj_exec() {
while getopts ':n:' opt; do
case $opt in
n)
if grep -q '^-\?[0-9]\+$' <(echo "$OPTARG"); then
if [ "$OPTARG" -ge -1000 -a "$OPTARG" -le 1000 ]; then
oom_score_adjust=$OPTARG
else
echo "Acceptable values for -n are from -1000 to 1000" >&2
return 255
fi
else
echo "Improper format for -n: $OPTARG" >&2
return 255
fi
break
;;
:)
echo "option -$OPTARG requires a value" >&2
return 255
;;
*)
echo "Unknown option -$opt" >&2
return 255
;;
esac
done
command=${@:$OPTIND}
# job control requires the monitor option which
# is usually not set for non-interactive shells
prev_state=$(set +o | grep monitor)
set -o monitor
$command &
pid=$!
echo "$oom_score_adjust" > /proc/$pid/oom_score_adj
fg %% > /dev/null
ecode=$?
# restore the previous state of the shell
$prev_state
return $ecode
}
oom_adj_exec $@
Пример использования:
./oom_adj_exec.sh -n -500 /usr/bin/mem_bloater
Хотя это, кажется, работает, я не могу избавиться от ощущения, что там что-то ждет, чтобы пойти ужасно неправильно. Есть ли что-нибудь, что выделяется как действительно ужасная идея и / или ожидающая катастрофа?
Я тоже это сделал, но не так хорошо, например:
(echo 1000 > /proc/self/oom_score_adj && exec /usr/bin/blah)
Поскольку он заключен в круглые скобки, он запускает подоболочку, устанавливает оценку OOM для оболочки (в данном случае - 1000, чтобы с большой вероятностью погибнуть в ситуации OOM), а затем exec
заменяет подоболочку на предполагаемую программу, оставляя без изменений новую оценку OOM. Это также не повлияет на оценку OOM родительского процесса / оболочки, поскольку все происходит внутри подоболочки.