- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的 raspberry pi(raspbian 运行)上,我想在空闲系统 5 分钟后(没有鼠标或键盘操作)将当前桌面切换到桌面 n#0,通过 wmctrl -s 0
和 xprintidle
用于空闲时间检查。请记住我不是专家...
我尝试了 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 6年前关闭。 Improve this
我的 symfony 应用程序 (3.4.8) 似乎忽略了任何延长 session 的尝试。解决此问题的最佳行动方案是什么?文档非常模糊。 应用程序/配置/security.yml security:
如何在Rails应用程序中设置如果任何用户闲置30分钟或特定时间段,则应自动注销该用户。 任何人都可以提出任何解决方案。我正在使用dev进行身份验证。任何帮助表示赞赏。 最佳答案 您应该使用 Time
我发现 Azure 容器实例 (ACI) 非常令人困惑。在 Azure 容器应用中,如果没有请求,服务将缩减至零并停止计费。然而ACI也有这样的功能吗? 例如,如果我部署一个每月调用一次的容器,并且每
我发现 Azure 容器实例 (ACI) 非常令人困惑。在 Azure 容器应用中,如果没有请求,服务将缩减至零并停止计费。然而ACI也有这样的功能吗? 例如,如果我部署一个每月调用一次的容器,并且每
有谁知道我如何编写一个 Javacript 函数,如果浏览器的 Javascript 引擎空闲了一定时间,该函数返回 true ? 我很乐意使用 mootools/jQuery 等,如果更容易的话,我
下面的方法会在 15 分钟后注销用户。但问题是,即使用户处于事件状态,也会将其注销。 我正在寻找解决方案,当用户在整整 15 分钟内不事件时,该方法将把他注销,而不是该方法不会运行。 public v
我需要我的应用程序在设备闲置一定时间后重新打开。换句话说,我的应用程序不会进入休眠模式并进入黑屏,而是会重新打开(假设它在后台运行)。将其视为“空闲屏幕”应用。 这在理论上相当简单,但我什至不知道它是
我正在制作一个需要监视 Gmail 帐户是否有新邮件的程序,为了尽快收到它们,我正在使用 JavaMail 的闲置功能。这是我用来调用 folder.idle() 的线程中的代码片段: //Run m
我的应用程序通过推送通知执行静默后台获取。一切正常,当用户在过去 60 分钟内打开应用程序或在 60 分钟内发送推送通知时,从我们的服务器发送的推送通知会按预期触发静默后台提取 - 即使设备已锁定。
在我的 raspberry pi(raspbian 运行)上,我想在空闲系统 5 分钟后(没有鼠标或键盘操作)将当前桌面切换到桌面 n#0,通过 wmctrl -s 0 和 xprintidle 用于
在 iOS 应用程序中,您可以设置 application.idleTimerDisabled = YES 以防止手机自动锁定。 我需要在移动版 Safari 中为像 Doodle Jump 这样的游
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我一直在 AWS Lambda 中修改 nodejs 代码,由一些 API 网关端点调用。我注意到在没有任何 API 网关调用的情况下经过一定时间后,下一个 API 网关请求将超时。我将收到标准的 L
我是一名优秀的程序员,十分优秀!