Linux 空闲5分钟后切换桌面(xprintidle):crontab还是守护进程?
在我的raspberry pi(raspbian running)上,我希望在空闲系统5分钟后(无鼠标或键盘操作),通过Linux 空闲5分钟后切换桌面(xprintidle):crontab还是守护进程?,linux,bash,crontab,daemon,raspberry-pi3,Linux,Bash,Crontab,Daemon,Raspberry Pi3,在我的raspberry pi(raspbian running)上,我希望在空闲系统5分钟后(无鼠标或键盘操作),通过wmctrl-s 0和xprintidle检查空闲时间,将当前桌面切换到桌面n#0。 请记住我不是专家 我尝试了两种不同的方法,但都不起作用,我想知道哪种方法是完成工作的最佳方法: bash脚本和crontab 我编写了一个简单的脚本,检查xprintidle是否大于先前设置的$IDLE\u TIME,而不是它切换桌面(保存在/usr/local/bin/switchDeskt
wmctrl-s 0
和xprintidle
检查空闲时间,将当前桌面切换到桌面n#0。
请记住我不是专家
我尝试了两种不同的方法,但都不起作用,我想知道哪种方法是完成工作的最佳方法:
bash脚本和crontab
我编写了一个简单的脚本,检查xprintidle
是否大于先前设置的$IDLE\u TIME
,而不是它切换桌面(保存在/usr/local/bin/switchDesktop0OnIdle
中):
脚本本身就可以工作
然后我将它添加到crontab(crontab-e
),以便每6分钟运行一次
*/6 * * * * * sudo /usr/local/bin/switchDesktop0OnIdle
不确定是否需要sudo
无论如何,它不起作用:通过谷歌搜索,我了解到crontab在自己的环境中运行,并带有自己的变量。尽管我不记得如何访问这个环境(oops),但我记得我在其中运行脚本时遇到了以下两个错误(在“普通”shell中正常工作)
(是否重要?)无法打开显示
或类似错误:基本上bla-bla-ge错误,应为一元运算符
在此环境中不起作用a返回空值xprintidle
/usr/local/bin/switchDesktop0OnIdle
#!/bin/bash
triggered=false
while :
do
if [ `xprintidle` -ge 300000 ]; then
if [ triggered == false ]
wmctrl -s 0
triggered = true
fi
else
triggered = false
fi
fi
done
同样,脚本本身也是有效的
我试图在/etc/init.d/switchDesktop0OnIdle
中创建一个守护进程(这里不是专家,修改了现有的守护进程)
是我安排的
sudo update-rc.d switchDesktop0OnIdle defaults
及
(必要吗?)
…什么也没发生。。。
另外,我没有发现进程具有ps-ef | grep switchDesktop0OnIdle
,但它似乎是在sudo服务switchDesktop0OnIdle状态下运行的
有人能帮忙吗?
非常感谢。
Giuseppe正如您所怀疑的,问题是当您从init或cron运行脚本时,它们没有在您希望它们控制的GUI环境中运行。原则上,Linux系统可以运行多个X环境。当您使用一个时,有一些环境变量将您正在使用的可执行文件指向您所在的环境 解决方案分为两个部分:脚本必须知道它们在哪个环境上执行操作,并且必须具有与该环境交互的授权 几乎可以肯定,您使用的显示值是“:0”,因此脚本开头的
export DISPLAY=:0
将处理问题的第一部分。(可能是“:0.0”,这实际上是等效的)
授权有点复杂。X可以设置为以不同的方式进行授权,但最常见的是在您的主目录中有一个文件.Xauthority,其中包含一个由X服务器检查的令牌。如果您在自己的crontab中安装脚本,它将在您自己的用户id下运行(您可能不应该使用sudo),因此它将读取正确的.Xauthority文件。如果从根crontab或init脚本运行,它将作为根用户运行,因此它可以访问所有内容,但仍需要知道从何处获取令牌。我认为在脚本中添加export-XAUTHORITY=/home/joe/.XAUTHORITY
会起作用。(假设您的用户id是joe。)
#! /bin/sh
# /etc/init.d/switchDesktop0OnIdle
### BEGIN INIT INFO
# Provides: switchDesktop0OnIdle
# Required-Start: $all
# Required-Stop: $all
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:
# Description:
### END INIT INFO
DAEMON=/usr/local/bin/switchDesktop0OnIdle
NAME=switchDesktop0OnIdle
test -x $DAEMON || exit 0
case "$1" in
start)
echo -n "Starting daemon: "
start-stop-daemon --start --exec $DAEMON
echo "switchDesktop0OnIdle."
;;
stop)
echo -n "Shutting down daemon:"
start-stop-daemon --stop --oknodo --retry 30 --exec $DAEMON
echo "switchDesktop0OnIdle."
;;
restart)
echo -n "Restarting daemon: "
start-stop-daemon --stop --oknodo --retry 30 --exec $DAEMON
start-stop-daemon --start --exec $DAEMON
echo "switchDesktop0OnIdle."
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
sudo update-rc.d switchDesktop0OnIdle defaults
sudo service switchDesktop0OnIdle start