Почему sudo -E не сохраняет мою переменную среды $ HOME?

Чтобы узнать, следует ли посылать процессу сигнал STOP или CONT, вам необходимо сначала выяснить его текущее состояние.

  • Если он остановлен, вы должны отправить CONT.
  • Если это не остановлено, вы должны отправить STOP.

Состояние запущенного процесса можно узнать с помощью ps . Если процесс остановлен, то его состояние, как сообщает ps -ostate = , будет содержать букву T (знак равенства остановит вывод ps заголовок).

#!/bin/bash

command="audacity"

pids="$( pgrep "$command" )"

if [[ -z "$pids" ]]; then
    printf '"%s" is not running\n' "$command" >&2
    exit 1
fi

for pid in $pids; do
    state="$( ps -ostate= -p "$pid" )"

    stopped=0

    case "$state" in
        *T*)    stopped=1 ;;
    esac

    if (( stopped )); then
        kill -s CONT "$pid"
        printf '"%s" (%d) has been unpaused\n' "$command" "$pid"
    else
        kill -s STOP "$pid"
        printf '"%s" (%d) has been paused\n' "$command" "$pid"
    fi
done

В сценарии существует теоретическое состояние гонки, при котором команда могла завершиться между вызовом pgrep и вызовом kill . Все, что произойдет в этом случае, - это то, что kill будет жаловаться на «отсутствие такого процесса».

2
20.12.2016, 15:27
1 ответ

В качестве меры предосторожности, sudo сбрасывает список переменных окружения (TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME и SUDO_*) в опции env_reset, которая включена по умолчанию. Для того чтобы HOME переносился из вашей учетной записи пользователя в среду sudo, вам придется либо:

  • использовать тег SETENV в правиле sudo вместе с опцией -E, либо

  • специально снять опцию env_reset.

Дополнительно убедитесь, что опция always_set_home выключена (по умолчанию она выключена).

Все подробности и взаимодействие смотрите на странице sudoers man.

0
27.01.2020, 22:43

Теги

Похожие вопросы