Ajustar o o_s_score no lançamento do processo

2

Eu tenho alguns servidores que começaram a matar seus processos de backup e, apesar de eu entender que encontrar a condição oom é muito ruim, eu preciso desse processo para não morrer. que os backups acontecem corretamente enquanto o problema de memória é resolvido.

Para esse fim, tentei criar uma maneira de lançar processos com oom_scores ajustados de forma semelhante ao lançamento de um processo com 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 $@

Exemplo de uso:

./oom_adj_exec.sh -n -500 /usr/bin/mem_bloater

Embora pareça funcionar, não consigo me livrar da sensação de que há algo esperando lá para dar errado. Existe alguma coisa que se destaca como sendo uma ideia verdadeiramente terrível e / ou um desastre esperando para acontecer?

    
por Sammitch 29.06.2016 / 20:19

1 resposta

0

Eu também fiz isso, mas não tão bem assim:

(echo 1000 > /proc/self/oom_score_adj && exec /usr/bin/blah)

Por estar entre parênteses, ele lança uma subshell, define a pontuação OOM do shell (neste caso, 1000, para torná-lo extremamente provável de ser morto em uma situação OOM) e, em seguida, o exec substitui a subshell com o programa pretendido, deixando a nova pontuação OOM intacta. Também não afetará a pontuação OOM do processo / shell pai, já que tudo está acontecendo dentro da subcamada.

    
por 18.05.2018 / 09:44