我的要求与这个因为我想在启动时为两个非root用户分别启动一个窗口管理器。
为了进行测试,我首先准备了以下几行.xinitrc和/或.xsession在主目录中用户2和用户3像这样:
#!/bin/sh
exec icewm
然后我手动登录到虚拟控制台用户2或者用户3或者打开 xterm 窗口并输入此命令:
xinit -- /usr/bin/Xvfb :3 -cc 4 -screen 0 1024x768x16
这完成了工作 - icewm 和 Xvfb 在后台运行。
现在我想自动执行登录和命令初始化在启动时。但是以下方法均不起作用:
以 root 身份手动输入这两个命令或将它们放在 /etc/rc.local 中:
su -l user2 -c xinit -- /usr/bin/Xvfb :3 -cc 4 -screen 0 1024x768x16
No protocol specified
IceWM: Can't open display: :0. X must be running and $DISPLAY set.
start-stop-daemon --start -u user2 -g user2 -b --pidfile /tmp/pid --exec /usr/bin/xinit -- -- Xvfb :3
ps ax
[Xorg] <defunct>
如能得到帮助将不胜感激!
[测试 alex.d. 的方法后进行编辑]
文件/home/user2/.xsession:
#!/bin/bash
export DISPLAY=localhost:3
export XAUTHORITY=$HOME/.Xauthority
exec icewm
以 root 身份发出此命令:
su -l user2 -c /usr/bin/startx -- /usr/bin/Xvfb :3 &
我明白了:
hostname: Name or service not known
xauth: (stdin):1: bad display name "example.com:2" in "add" command
IceWM: Can't open display: localhost:3. X must be running and $DISPLAY set.
xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: server error
xauth: (argv):1: bad display name "example.com:2" in "remove" command
有什么想法吗?请告诉我!
答案1
这是我的工作方法。
文件/etc/systemd/system/john.service:
[Unit]
Description=xinit - user "john"
[Service]
User=john
Group=john
ExecStart=/usr/bin/xinit openbox-session -- /usr/bin/Xvfb :1 -nolisten tcp
ExecStopPost=/usr/bin/killall -u john
[Install]
WantedBy=multi-user.target
文件/home/john/.config/openbox/自动启动:
wine my_program.exe
谢谢大家的帮助!
答案2
从 rc.local 启动 X11 时,它不是从用户会话(consolekit 或 logind)内部启动的,因此环境中缺少某些内容。您应该尝试使用旨在启动会话的 startx 来启动 X11,而不是使用裸 xinit。