Назад | Перейти на главную страницу

Скрипты в /etc/profile.d выполняются дважды при входе в систему

Справочная информация:

Я пытаюсь настроить сервер Linux под управлением CentOS 7 для нескольких пользователей. После установки java я хочу глобально установить $JAVA_HOME переменную среды для всех пользователей и добавьте ее в $PATH.

Для этого я пошел в /etc/profile скрипт, который вызывается при запуске. Я последовал совету в верхней части сценария:

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

Я создал свой /etc/profile.d/custom.sh скрипт для настройки среды для java

custom.sh

# Java configuration
export JAVA_HOME=/usr/lib/jvm/java
export PATH=${JAVA_HOME}/bin:${PATH}

Эта проблема:

Когда я вхожу в систему, /etc/profiles.d/custom.sh скрипт (вместе с любым другим скриптом, который я добавил /etc/profiles.d) вызывается дважды и добавляет $JAVA_HOME к $PATH дважды.

Я понял, что это похоже на то, что все скрипты в /etc/profiles.d вызываются из обоих /etc/profile И /etc/bashrc.

# This is in both /etc/profile and /etc/bashrc
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

На самом деле это не кажется правильным, но я немного покопался, и оказалось, что так оно и есть ...


Вопросы:

  1. Это ошибка операционной системы CentOS 7?

  2. Есть ли хороший обходной путь, который я могу использовать для создания глобальных настроек среды без их повторной установки? (Я не хочу их вставлять /etc/environment потому что я не могу использовать переменные bash в этом файле.)

Я создавал сотни centos 7 за последние 6 месяцев, немного подправлял их и никогда не видел, что вы описываете. Как сказал Томас, по умолчанию /root/.bashrc не вызывает / исходные скрипты в /etc/profile.d.

РЕДАКТИРОВАТЬ : Фактически, /root/.bashrc ИМЕЕТ источник /etc/prodile.d/* с помощью / etc / bashrc и предотвращает эхо:

# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        if [ "$PS1" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

Угадайте, что мои недавние проблемы были разными, и мне пришлось решать их быстро и недостаточно копать. Мои извинения.

СТАРЫЙ ОТВЕТ

1 / Думаю, это действительно не ошибка (какой ISO вы получили для своего centos 7? Вы суммировали его md5? Задавать этот вопрос мне кажется странным)

2 /, а обходного пути нет, но удалить код, который заставляет скрипты загружаться дважды?

/etc/profiles.d кажется правильным местом для размещения некоторых скриптов, если они "молчаливы", то есть определяют некоторые переменные среды, но не создают эхо или вызывают какой-то динамический motd, иначе в какой-то момент он будет взаимодействовать некорректно, с другими скриптами, которые вы будете запускать (в последнее время получил опыт установки netdata).

Некоторые интересные моменты читать на unix.stackexchange.