linux下 显示屏idle一段时间后 如何关掉背光,关于linux:闲置5分钟后切换桌面(xprintidle):crontab还是守护程序?...

在我的树莓派(正在运行树莓派)上,我想在闲置系统5分钟(无鼠标或键盘操作)之后通过wmctrl -s 0和xprintidle将当前桌面切换到桌面n#0,以检查空闲时间。

请记住,我不是专家...

我尝试了两种不同的方法,但没有一种有效,我想知道哪种方法是完成工作的最佳方法:

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在具有自己变量的环境中运行。即使我不记得如何访问该环境(糟糕),我也确实记得在运行脚本的过程中遇到了这两个错误(在"正常" shell中正确运行)

could not open display(重要吗?)

bla bla -ge error, unary operator expected或类似的东西: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环境。当您使用一个可执行文件时,会有一些环境变量将使用的可执行文件定向到您所在的环境。

解决方案有两个部分:脚本必须知道它们在哪个环境上运行,并且它们必须具有与该环境交互的权限。

几乎可以肯定,您使用的DISPLAY值为":0",因此脚本开始处的export DISPLAY=:0将处理问题的第一部分。 (它可能是":0.0",实际上是等效的)。

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

非常感谢你,它奏效了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下,可以使用pthread库来创建和管理线程。std::thread是C++11标准中对pthread库的封装,因此可以使用pthread库提供的函数来调整线程的调度策略和时间片,从而降低CPU占用率。 要调整线程的调度策略,可以使用pthread_attr_setschedpolicy函数。以下是一个示例: ```cpp #include <pthread.h> void* threadFunc(void* arg) { // 线程的执行逻辑 } int main() { pthread_t thread; pthread_attr_t attr; pthread_attr_init(&attr); // 设置线程的调度策略为SCHED_IDLE(空闲调度策略) pthread_attr_setschedpolicy(&attr, SCHED_IDLE); pthread_create(&thread, &attr, threadFunc, nullptr); // 等待线程结束 pthread_join(thread, nullptr); return 0; } ``` 上述示例中,调用pthread_attr_setschedpolicy函数将线程的调度策略设置为SCHED_IDLE,即空闲调度策略。这会使得线程在系统空闲时才会得到调度,从而降低CPU占用率。 要调整线程的时间片,可以使用pthread_attr_setschedparam函数。以下是一个示例: ```cpp #include <pthread.h> void* threadFunc(void* arg) { // 线程的执行逻辑 } int main() { pthread_t thread; pthread_attr_t attr; pthread_attr_init(&attr); // 设置线程的调度策略为SCHED_OTHER(默认调度策略) pthread_attr_setschedpolicy(&attr, SCHED_OTHER); // 设置线程的时间片为10ms struct sched_param param; param.sched_priority = 0; pthread_attr_setschedparam(&attr, &param); pthread_create(&thread, &attr, threadFunc, nullptr); // 等待线程结束 pthread_join(thread, nullptr); return 0; } ``` 上述示例中,调用pthread_attr_setschedparam函数将线程的时间片设置为10ms。这会使得线程每次被调度执行的时间更短,从而降低CPU占用率。 请注意,具体的调度策略和时间片设置可能因操作系统和硬件平台而有所不同。建议在实际使用中根据需求和具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值