Linux 空闲5分钟后切换桌面(xprintidle):crontab还是守护进程?

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

在我的raspberry pi(raspbian running)上,我希望在空闲系统5分钟后(无鼠标或键盘操作),通过
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错误,应为一元运算符
    或类似错误:基本上
    xprintidle
    在此环境中不起作用a返回空值
我错过了什么

无限,而bash脚本作为守护进程运行

第二种方法我尝试设置一个内部无限的脚本,同时检查xprintidle是否大于5分钟。在这种情况下,桌面被切换(不那么优雅?)。还保存在
/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