gpt4 book ai didi

linux - 闲置 5 分钟后切换桌面 (xprintidle) : crontab or daemon?

转载 作者:太空狗 更新时间:2023-10-29 12:11:32 26 4
gpt4 key购买 nike

在我的 raspberry pi(raspbian 运行)上,我想在空闲系统 5 分钟后(没有鼠标或键盘操作)将当前桌面切换到桌面 n#0,通过 wmctrl -s 0xprintidle 用于空闲时间检查。请记住我不是专家...

我尝试了 2 种不同的方法,但都不起作用,我想知道其中哪一种是完成工作的最佳方法:

bash 脚本和 crontab

我写了一个简单的脚本来检查 xprintidle 是否大于之前设置的 $IDLE_TIME,然后切换桌面(保存在 /usr/local/bin/switchDesktop0OnIdle):

#!/bin/bash

# 5 minutes in ms
IDLE_TIME=$((5*60*1000))

# Sequence to execute when timeout triggers.
trigger_cmd() {
wmctrl -s 0
}

sleep_time=$IDLE_TIME
triggered=false

while sleep $(((sleep_time+999)/1000)); do
idle=$(xprintidle)
if [ $idle -ge $IDLE_TIME ]; then
if ! $triggered; then
trigger_cmd
triggered=true
sleep_time=$IDLE_TIME
fi
else
triggered=false
# Give 100 ms buffer to avoid frantic loops shortly before triggers.
sleep_time=$((IDLE_TIME-idle+100))
fi
done

脚本本身有效。

然后我将它添加到 crontab (crontab -e) 让它每 6 分钟运行一次

*/6 * * * * * sudo /usr/local/bin/switchDesktop0OnIdle

不确定是否需要 sudo

无论如何它不起作用:谷歌搜索我了解到 crontab 在它自己的环境中运行,有它自己的变量。尽管我不记得如何访问这个环境(哎呀),但我确实记得我在其中运行脚本时遇到了这 2 个错误(在“普通”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 中创建一个守护进程(这里真的不是专家,修改了一个现有的)

#! /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

(必要的?)

...什么也没发生...我也找不到 ps -ef | 的进程grep switchDesktop0OnIdle 但它似乎正在运行 sudo service switchDesktop0OnIdle status

有人可以帮忙吗?谢谢你朱塞佩

最佳答案

正如您所怀疑的,问题是当您从 init 或 cron 运行脚本时,它们并未在您希望它们控制的 GUI 环境中运行。原则上,一个Linux系统可以运行多个X环境。当您使用一个时,有一些环境变量将您正在使用的可执行文件定向到您所在的环境。

解决方案分为两部分:您的脚本必须知道它们正在作用于哪个环境,并且它们必须具有与该环境交互的授权。

您几乎可以肯定正在使用“:0”的 DISPLAY 值,因此脚本开头的 export DISPLAY=:0 将处理问题的第一部分。 (它可能是“:0.0”,这实际上是等价的)。

授权有点复杂。 X 可以设置为以不同的方式进行授权,但最常见的是在您的主目录中有一个文件 .Xauthority,其中包含一个由 X 服务器检查的 token 。如果您在自己的 crontab 中安装脚本,它将在您自己的用户 ID 下运行(您可能不应该使用 sudo),因此它将读取正确的 .Xauthority 文件。如果您从 root crontab 或 init 脚本运行,它将以 root 用户身份运行,因此它可以访问所有内容,但仍然需要知道从哪里获取 token 。我认为将 export XAUTHORITY=/home/joe/.Xauthority 添加到脚本中会起作用。 (假设您的用户 ID 是 joe。)

关于linux - 闲置 5 分钟后切换桌面 (xprintidle) : crontab or daemon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43041183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com