我正在实现USB插拔/通知(这里是related question),我需要执行诸如notify-send“device plugged”“我的设备标题”之类的内容.问题是要使这个命令工作,我首先应该设置DISPLAY,如下所示:
export DISPLAY=":0.0"
其次,该命令应由适当的用户调用.对于用户dimon说:
su dimon -c "notify-send 'device plugged' 'My Device Title'"
因此,我需要获取所有活动X会话和相应用户的列表,并在其DISPLAY上为每个用户调用notify-send.
我尝试使用w,Linux Mint 13 MATE的示例输出:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dimon tty8 :0 Sun15 3days 1:38m 1.95s x-session-manager
dimon pts/0 :0 Sun15 0.00s 0.20s 0.00s tmux
所以我们有用户名和显示.我决定像那样解析它:
declare -a logged_users=(`w |grep -vP "^(USER| )" |awk '{if (NF==8){print $1" "$3} else {print $1" :0"}}' |sort |uniq`)
现在,我有数组logged_users:[0]包含dimon,[1]包含:0.这将是伟大的,但不幸的是它无处不在.比如,在带有lightdm的Ubuntu 12.04上,我们有这个w输出:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
nui tty7 18:22 35:56 1.66s 0.11s gnome-session -
nui pts/0 :0.0 18:55 5.00s 0.20s 0.00s w
不知道为什么gnome-session没有FROM值.
更糟糕的是,在xubuntu:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
nui tty7 15:50 31:07 52.55s 0.13s /bin/sh /etc/xd
根本没有显示!如果其他用户登录,则也没有为他指定显示(但实际上是:1.0)
所以,我正在寻找另一种方法.我也知道我们在这里有一个所有活动X会话的列表:/tmp/.X11-unix,我可以像这样得到它们的列表:
cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done
但后来,我不知道如何检索用户.
那么,如何获取所有活动X会话和适当用户的列表?
解决方法:
这是本地X服务器用户的解决方案(忽略具有远程或虚拟X服务器的本地X客户端).
您确定显示管理器的PID(它是Xorg的父PID),确定其子节点的PID并确定其中一个为父节点的所有进程的用户:
#! /bin/bash
xorg_pid=$(pidof -s /usr/bin/Xorg)
test -n "$xorg_pid" || exit 1
dm_pid=$(ps -eo pid,ppid,args | \
awk -v xorg_pid=$xorg_pid '$1 == xorg_pid {print $2}')
pid_list="$(ps -eo pid,ppid,cmd | \
awk -v dm_pid=$dm_pid '$2 == dm_pid {if (matchnr == 0) '\
'{ printf "%s%d ","$2 == ",$1; matchnr++;} '\
'else printf "%s%d ","|| $2 == ",$1;}')"
ps -eo pid,ppid,user,cmd | awk "$pid_list"'{print $3}'
标签:linux,session,x11 来源: https://codeday.me/bug/20190813/1646322.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。