我有一个守护程序,它以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就足够了。
lightdm