LINUX.ORG.RU

Обновление переменных пользователя

 , , ,


0

1

Собираю rpm-пакет для Opensuse с %any_programm. После установки пакета у всех пользователей системы должна появиться переменная среды типа PROG_HOME=$HOME/.prog Нагуглил, что добавление переменной среды осуществляется через создание /etc/profile.d/prog.sh, с лаконичным export'ом. Проблема в том, что для вступления в силу этих изменений необходимо перезагрузить свою DE'шку, дабы процесс sh, в котором она выполняется, перечитал эти настройки. Есть ли способ добавить переменную среды пользователю без ребута? Сейчас использую хак вида:

for PID in `ps -axo pid,cmd | egrep "/bin/sh|/bin/bash"  | awk '{print $1}'`;
do
        if [ -f /proc/$PID/environ ];
        then
                echo -e "call putenv (\"PROG_HOME=`xargs --null --max-args=1 echo < /proc/$PID/environ | egrep ^HOME | cut -d= -f2`/.prog\")\ndetach\nquit" | gdb -p $PID > /dev/null 2>&1;
        fi;
done
То есть отлавливаю все sh/bash процессы и с помощью gdb добавляю туда нужную переменную. Есть ли более адекватный способ?


Можно вопрос? А зачем на практике нужно добавление переменной? Приведи конкретно описание того, что ты в результате хочешь получить.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Например, чтобы при работе программа знала куда писать свои файлы. В моём конкретном случае, я пытаюсь нормально опакетить игру crawl. В текущем состоянии она пишет сейвы в /var/games/crawl, что плохо, потому что у разных пользователей системы будут одни сейвы на всех. И ещё есть проблемы с тем, что нельзя поменять настройки игры не от рута, потому что после изменения, например, языка, игра перестраивает свою БД, которая хранится рядом с сейвами. Согласитесь, бред получается. Поэтому для каждого пользователя нужно создать переменную CRAWL_DIR, которая смотрела бы в его домашнюю директорию . чтобы при запуске crawl знал откуда брать сейвы, настройки и куда их потом писать.

bemyak
() автор топика
Ответ на: комментарий от bemyak

Это решается заданием переменной при запуске игры. Например:

$ CRAWL_DIR="/home/vasya/.crawl" /usr/bin/crawl
(Предполагается, что сейвы будут храниться в '/home/vasya/.crawl' , а запускаемый файл называется '/usr/bin/crawl')
Если мы говорим про «опакетить», то проще всего при инсталляции подменить запускаем файл на кратенький скрипт, который будет вот так запускать программу (ибо тильда ~ в shortcut'ах может не раскрываться).

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Да, я думал об этом, можно в %post сделать

mv /usr/bin/crawl /usr/share/crawl/
mv /usr/bin/crawl-sdl /usr/share/crawl/
И потом создать вместо них скрипты, которые дергают перемещённые бинарники с нужными настройками окружения, но почему-то я счёл этот метод чересчур костыльным.

Я думал, есть проверенный метод решения подобных проблем, так как при установке jdk у всех появляется переменная JAVA_HOME.

Наверное, придётся всё-таки скриптами это решать...

bemyak
() автор топика
Ответ на: комментарий от bemyak

По-моему, этот способ наоборот менее костыльный.

при установке jdk у всех появляется переменная JAVA_HOME.

Без перезагрузки или перелогина на всех tty*? Уверен? Что-то не верится.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Уверен?

Надо проверить. Но ситуация, когда ты установил пакет и тут же запустил его, - нормальная и часто встречаемая.
Предложенный мной способ костыльный ровно 1 раз - во время установки пакета. Он не затрагивает файлы самой программы. Поэтому мне показалось, что это менее костыльный костыль :) Хочется услышать ещё чьё-нибудь мнение, прежде чем резолвить тему.

bemyak
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.