加载用户桌面后如何从脚本中进行检测?


11

我有一个守护程序,它以bash实现并通过cron@reboot选项运行,该守护程序显示桌面处于非活动状态。脚本如下(出于测试目的,时间简短):

#!/bin/bash
P_STATE=0
while :
do
    sleep 5
    if [ $P_STATE == 0 ]; then
         [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
    else
         [ `xprintidle` -le 25000 ] && P_STATE=0
done

问题:例如,如果用户仍然在登录屏幕中,xprintidle并且wmctrl由于尚未加载桌面而失败。为了避免这种情况,我在脚本的开头放置了以下几行:

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

因此,脚本等待用户(在crontab文件中将USER变量设置为我的用户名)记录下来。但是,例如,如果用户开始一个终端会话(而不是像KDE或GNOME这样的图形会话),脚本也将继续。

如何确定用户是否已经处于能够“显示桌面模式”的“图形”会话中?而且,如何确保“图形”会话已完全加载并且未处于加载过程之类?

我的解决方案: 我的(非正式)解决方案是在主循环中添加以下grep行:

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

目标Windows Manager命令为 “ $ WM_CMD” 。我假设,如果系统中正在运行Windows Manager命令,则意味着桌面已完全加载,并且可以肯定使用任何“图形”命令。

WM_CMD变量在哪里定义?在该crontab行中:

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

但我也认为,可以通过其他系统请求来检测“ Windows Manager命令”。但是,对我来说,在crontab文件中定义WM_CMD就足够了。


您正在使用什么登录管理器?
mtahmed 2013年

我的登录管理器是lightdm
Peregring-lk

这个超级用户问题可能会对您有所帮助。我不确定它是否会完全回答您的问题。
Rany Albeg Wein

1
它不是特别健壮,但是您可以检查Gnome / KDE流程...
jasonwryan

1
您应该记录您所做的回答。它可以帮助其他人。
jasonwryan

Answers:


2

尝试使用D-Bus从logind服务中查询会话信息。它org.freedesktop.login1.Manager的界面与几个信号像SessionNewSeatNeworg.freedesktop.login1.Seatorg.freedesktop.login1.User界面。它可以帮助获取会话/座位/用户状态。


1

使用登录会话启动脚本~/.xprofile为您创建一些标志文件。是it ~/.xlogin_flag,然后在您的其他脚本中使用inotifywatchfrom包inotify-tools查看正在创建,触摸或删除它。


1

检查w命令输出。您将在LOGIN @字段中看到登录类型(X显示)。


1

我认为检查X11中是否已连接用户的最简单方法是检查写入的进程,$HOME/.xsession-errors因为当您以图形方式登录时,所有的stderr都会被重定向到那里。

否则,只需使用w命令,如@Grzegorz所建议:如果FROM列以开头,:则它是图形会话。


0

检入lightdm的运行时目录。在具有systemd和lightdm的Arch上,当用户登录时,将创建一个xauthority文件。

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

您可以在while循环中使用类似的内容对此进行测试。

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.