$ cat /etc/xrdp/startwm.sh
#!/bin/sh
. /etc/X11/Xsession
startxfce4
I found that /etc/X11/Xsession does not set $DISPLAY anyhow, although it loads some quite a few files, both systemwide and user specific, which could potentially define $DISPLAY. From what I checked, none of those files define $DISPLAY as of now. So /usr/bin/startxfce4 is the one defining $DISPLAY. Indeed, I found lines such as these:
if test "x$DISPLAY" = "x"
then
echo "$0: Starting X server"
prog=xinit
else
echo "$0: X server already running on display $DISPLAY"
prog=/bin/sh
fi
The webadmins to the servers told me that they'd rather not make complex/big changes to the servers as they are production servers, and are not quite open to testing out different setups. I proposed to edit the /etc/xrdp/startwm.sh such that `startxfce4` is called with an option for the $DISPLAY, which is calculated based on $UID. They disagree, as the server has quite a lot of users and the users are all temporary (about a year). Since $UID is simply an integer, that didn't seem a proper reason to disagree to my proposal. Alas, it seems I should still be able to set $DISPLAY in the files that /etc/X11/Xsession loads:
# initialize variables for use by all session scripts
OPTIONFILE=/etc/X11/Xsession.options
SYSRESOURCES=/etc/X11/Xresources
USRRESOURCES=$HOME/.Xresources
SYSSESSIONDIR=/etc/X11/Xsession.d
USERXSESSION=$HOME/.xsession
USERXSESSIONRC=$HOME/.xsessionrc
ALTUSERXSESSION=$HOME/.Xsession
ERRFILE=$HOME/.xsession-errors
Specifically, ~/.xsession or ~/.xsessionrc seems to be reasonable places. However, none of these seems to have been loaded in /usr/bin/startxfce4. Rather, it is running xfce4 specific xinitrc:
if [ -f $BASEDIR/xinitrc ]; then
exec $prog $BASEDIR/xinitrc $CLIENTRC $SERVERRC
elif [ -f $HOME/.xfce4/xinitrc ]; then
mkdir -p $BASEDIR
cp $HOME/.xfce4/xinitrc $BASEDIR/
exec $prog $BASEDIR/xinitrc $CLIENTRC $SERVERRC
else
exec $prog /etc/xdg/xfce4/xinitrc $CLIENTRC $SERVERRC
fi
Neither $BASEDIR/xinitrc nor $HOME/.xfce4/xinitrc exists as of now, thus /etc/xdg/xfce4/xinitrc is ran by default. This file is quite long (abou 200 lines) but defiens DISPLAY nowhere. The most notable thing is it runs `xfce4-session` by itself, without any options.
I think I laid out my system configurations to the best of my abilities, without adding too many useless information. I think I have three options here, though am not quite sure which would be simplest and works:
A) I could try setting creating ~/.xsession or ~/.xsessionrc where I set a DISPLAY number (setting it in ~/.xinitrc seems to have stopped X11 to open connection next time I connect from another computer);
B) I could create my own ~/.config/xfce4/xinitrc, which will be executed by startxfce4 as $BASEDIR/xinitrc. There, I can copy the currently default /etc/xdg/xfce4/xinitrc to there, and specify a DISPLAY option for xfce4-sesion line;
C) Somehow, I could tell xfce4-session to always use the previous sessions saved in ~/.cache/sessions/ for a user, regardless of whether some optional parameters match, notably GEOMETRY etc. See contents of that file here:
cat ~/.cache/sessions/xfwm4-2e1965c2f-8b9b-4860-9173-6ba8cfa8cff1.state
[CLIENT] 0x3c00008
[CLIENT_LEADER] 0x3c00001
[WINDOW_ROLE] gnome-terminal-window-dc448239-c1b8-472f-9760-764c4b353700
[RES_NAME] gnome-terminal-server
[RES_CLASS] Gnome-terminal
[WM_NAME] someuser@somewhere: ~
[WM_COMMAND] (1) "gnome-terminal-server"
[GEOMETRY] (3,60,926,482)
[GEOMETRY-MAXIMIZED] (3,60,737,431)
[SCREEN] 0
[DESK] 0
[FLAGS] 0x10000
Not sure which would work, though I can test the first two myself, and not sure how to tell xfce4-session to always use previous session.
Hörmetjan Yiltiz wrote:
> Seems like a very simple solution! Do you know if this works for RDP? And
> what runs that vnc-run.sh? Is it executed upon SSH login, VNC login, or by
> the admin?
The vnc-run.sh is my own script
To automate it, you need to modify the script starting the session on the
server. Unfortunately I don't know what how exactly works in your setup.
The RDP/VNC client needs a running vnc server, so I login to the server and
execute this vnc-run.sh.
The vncserver reads .vnc/xstartup which spawns the session and desktop.
example:
#!/bin/sh
xsetroot -solid grey
icewm &
When you find a way to automate it, please post back here.
regards