- 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/
在前台程序上运行 valgrind 很容易。但是 valgrind 会为守护程序工作并在执行后给出输出。我该怎么做? 谢谢 最佳答案 是的,valgrind 肯定适用于守护程序。 许多守护进程都有某种
网络上有很多守护进程的示例实现。我看到的大多数不使用 daemon(3) 函数在后台运行程序。这只是品味、无知的问题,还是有充分的理由编写我自己的 daemonize 函数?使用 daemon(3)
我使用 apache commons 示例代码编写了一个守护进程: public class LockDaemon implements Daemon { @Override public void
docker出现cannot connect to the docker daemon. is the docker daemon running on this host错误解决办法 发生现象:
我正在使用 Ruby Daemon-kit 设置一个服务,为我的 Rails 应用程序执行各种后台操作。 当我在命令行上调用时它工作正常: ./bin/bgservice 我如何为它创建一个守护进程
当我尝试使用命令'react-native run-android'构建项目时,出现以下错误: 错误:无法找到或加载主类“Dorg.gradle.daemon = true” JS server al
我正在尝试从以下位置安装 memcached:http://blog.elijaa.org/index.php?post/2010/10/15/Memcached-for-Windows&simila
我使用 Xcode 创建了一个命令行工具应用程序。在那个应用程序中,我使用 NSWorkspace 来启动另一个应用程序包 (.app),如此处建议的那样。 MacOsX: How to launch
我正在尝试在一些Ubuntu 14.04流浪者盒子上使用consul设置docker swarm,但是docker守护程序存在问题。我已经在运行progrium / consul容器和swarm ma
我把android studio升级到3.2.0,并创建了默认项目。但是编译器报错: Android resource linking failed Output: D:\android1\proj
首先 - 我知道 UWSGI 建议使用 smart-attach-daemon 来自:http://uwsgi-docs.readthedocs.io/en/latest/AttachingDaemo
2018/09/27 我把android studio升级到3.2.0,并创建了默认项目。但是编译器报错: Android resource compilation failed Output: C
错误: Error 1 "bin\Debug\Daemon.exe.manifest;bin\Release\Daemon.exe.manifest" is an invalid value fo
尝试构建 Android 应用程序时出现此错误: > A failure occurred while executing com.android.build.gradle.internal.task
我已经从源码包安装了mysql-5.6.14 尝试开始: vaio1@vaio1-VPCEA3S1E:mysqld 2013-11-17 13:22:18 0 [Warning] Using uni
我知道一些(全部?)守护进程在启动时会 fork 。我的印象是,这是将子进程作为特权较低的用户运行,特别是如果守护进程类似于 HTTP 服务器。 为什么这是必要的?如果不 fork 子进程,进程就不能
我目前正在开发一个守护进程,它将执行很多不同的任务。它是多线程的,并且正在构建以处理几乎任何类型的内部错误而不会崩溃。好吧,我正在处理关闭请求,但我不确定我应该如何去做。 我有一个关闭 Hook 设置
Windows Server的Docker Windows Server 1709版,带有容器 Docker版本17.06.2-ee-6,构建e75fdb8 群集模式(工作程序节点,具有Ubuntu母
使用截至2017年8月25日的最新版本的Docker,我知道Docker不再需要VirtualBox安装程序以及boot2docker才能正常工作。但是,在尝试连接到它并使用docker-compos
是否使用 C 函数 daemon()与使用 fork()、setsid()、umask()、 等显式函数(除了无法设置所有守护进程参数之外)相比,Linux 守护进程在安全性或稳定性方面有任何劣势吗?
我是一名优秀的程序员,十分优秀!