Fedora每日一篇:登录和会话

Fedora每日一篇

登录和会话!

有个用户(Allen Halsey)这么文,
bash的手册页说登录shell会执行.bash_profile,但是我用gdm登录桌面,什么时候执行.bash_profile,如果不是这样,我在哪里定义环境变量呢?
这个问题的关键是登录和会话的区别。login是进入字符界面的系统认证过程,这个过程的为你启动一个shell和系统交互,每个用户的shell定义在/etc/passwd文件中,例如,

chris:x:500:500:Chris Tyler:/home/chris:/bin/bash

:是分隔符,第七项指出shell,该shell在登录时执行,以便用户和系统交互操作。该项也可以不是shell,可以是任何程序。典型的是不允许用户登录的话,可以把该项设置为/etc/nologin,这样用户登录会被提示不允许登录。(使用/etc/nologin.txt定制提示信息)

通常对于Fedora系统,shell是/bin/bash,Bourne-again shell。和其它shell一样,bash在启动时调用一些配置文件,启动脚本~/.bashrc,几个可能的profile,/etc/profile和~/.bash_profile,~/.bash_login 或~/.profile。Fedora默认为帐号设置~/.bash_profile。如果你登录一次然后执行多个shell实例,各个profile被执行一次,而~/.bashrc被执行三次!

会话则是完全另外一回事,是"图形界面的登录"。会话由显示管理器(例如gdm,kdm和xdm)启动。会话由会话管理器控制,会话管理器启动标准客户程序,重启程序和在会话结束时保存的应用程序的再启动。GNOME的会话管理器是gnome-session而KDE的是ksmserver(由startkde启动)。这些程序根本不理会/etc/passwd第七项的设置值!!因此不存在profile被执行。

但是事实原本比这更复杂,不是在于会话管理器本身,而是在于他的启动过程,会话管理器有/etc/X11/xdm/Xsession启动,在Fedora里,这个脚本不是直接去启动会话管理器,当启动GNOME会话时,它执行的是,

exec -l $SHELL -c "$SSH_AGENT $DBUS_LAUNCH gnome-session"

而对于KDE,它执行:

exec -l $SHELL -c "$SSH_AGENT $DBUS_LAUNCH startkde"

该命令会调用/etc/X11/xinit/xinitrc-common来设置环境变量。通常,SHELL是/bin/bash, 而SSH_AGENT是/usr/bin/ssh-agent,而DBUS_LAUCH是/usr/bin/dbus-lauch --exit-with-session。
综合起来看,这个命令的意思是bash以登录shell执行并执行/etc/profile和~/.bash_profile,接着启动ssh_agent和dbus-lauch,dbus-lauch则启动会话管理器。这么看来,profile设定的变量可以通过ssh_agent和dbus-lauch正确的为会话中运行的程序设置好。

我们可以测试这个执行流程,在~/.bash_profile文件末尾添加,

# display a message to stdout
echo ".bash_profile executed"

# display a message on the GUI display
zenity --info --text ".bash_profile executed"

# set an environment variable
export FDP=".bash_profile executed"

现在当你登录时,在字符界面,可以看到下面的内容,

Last login: Wed Aug 15 12:04:27 2007 from dailypackage.fedorabook.com
.bash_profile executed

(zenity:3689): Gtk-WARNING **: cannot open display:

[chris@localhost ~]$

注意,echo正确执行,而zenity命令无法执行,因为没有X。而当我们从图形界面登录时,zenity对话框显示出来了(没有窗口管理器,看到的对话框没有窗口边框等),而echo输出无从看到,如果检查环境变量FDP就可以知道我们的修改生效了,而执行流程也可以被验证。

$ echo $FDP
.bash_profile executed

在.bash_profile设置环境变量适用于各种环境的登录!

另外,如果profile需要同用户进行交互,需要侦测用户用什么方式登录的,例如,

if [ "$DISPLAY" ]
then

if zenity --question --text "Do you want to foo?"
then
ANSWER="Y"
else
ANSWER="N" # Default if zenity can't connect to display
fi

elif tty --quiet
then

echo -n "Do you want to foo? "
read ANSWER

else

echo "No tty and no GUI!"
ANSWER="N" # Default if we can't ask the user

fi

另外,如同~/.bash_profile在登录时被调用一样~/.bash_logout在登出系统时被执行。Fedora的logout脚本默认是清除屏幕内容。

Comments

Popular posts from this blog

Freeware Software Top 300 from winAddons.Com!

What is DevOPS?

RPM Build Tips!