【问题标题】:Detect inactivity from a scheduled task on Linux从 Linux 上的计划任务中检测不活动状态
【发布时间】:2012-11-25 11:05:31
【问题描述】:

我需要检测用户在我的 Linux 系统上的不活动状态,然后关闭它(相当无头的妻子,以及相当昂贵的电费...... :-)。

我需要安排脚本(在 crontab 中),所以我想没有任何依赖于 X 的工具可以工作(没有可用的 $DISPLAY)。

有什么想法吗?

更新

对于“用户不活动”,我的意思是用户输入不活动(鼠标和键盘)。

【问题讨论】:

  • 用户不活动是什么意思?没有键盘/鼠标输入?如果你现在正在运行一个进程(比如下载一个大文件)会发生什么?
  • 请正确定义不活动。
  • 是的,对不起...我刚刚更新了问题,更好地说明了用户不活动的含义
  • 我假设您需要一个命令行工具,但它仍应依赖于 X。因为没有 X,就不会有任何可以跟踪的鼠标或键盘输入。

标签: linux user-inactivity


【解决方案1】:

Xautolock 可能是适合您的工具。它允许您指定应触发命令的不活动分钟数。

【讨论】:

  • 但是,如何在“无人值守”模式下运行它? (来自 crontab?)
  • 您只需要启动一次,然后它就会在整个会话中出现。这可以在 init.d 或基于 @reboot 的 crontab 事件中完成。
【解决方案2】:

您可以考虑检查屏幕保护程序运行了多长时间。

#!/bin/bash

screensaver="atlantis"

t=$(
    # check for the screensaver
    ps h -o start -C $screensaver          |\
    # hh:mm:ss -> seconds
    awk -F: '{print $1"*3600+"$2"*60+"$3}' |\
    bc -l  2>/dev/null  | sort -n | tail -1
)

if [ "$t" == "" ]
then
    exit 0
fi

n=$(
    date "+%T"                             |\
    awk -F: '{print $1"*3600+"$2"*60+"$3}' |\
    bc -l  2>/dev/null
)

runtime=$(( $n - $t ))

if [ $runtime -gt 3600 ] || [ $runtime -lt 0 ]
then
    echo shutdown -h now 
fi

使用时间值需要从 then 中减去 now 以获得运行时间。 此外,在我的情况下,出现在进程表中的屏幕保护程序将根据选择的屏幕保护程序而有所不同。所以,上面的程序假设'atlantis'是当前的屏幕保护程序。

【讨论】:

  • 我喜欢你的回答。但是,在我的系统(Ubuntu 12.10)上,我的屏幕保护程序进程(“gnome-screensaver”)的时间始终是 00:00:04,因为我正在测试它 15 分钟......(系统从 10 小时开始运行...... .)
  • 我发现我的屏幕保护程序总是显示它已经运行了 16 秒。我推测 xscreensaver 进程处于活动状态并在该时间间隔轮询活动。
  • 是的,看起来是 CPU 时间,而不是时钟时间... :-(
  • 在 [[ 与 [ 在 bash 条件句中,我从未如此确定差异。我发现了这个:serverfault.com/questions/52034/…
  • 这个解决方案是失败的,没有正确的方法来确定进程的时钟时间。在 man 中挖掘 top 和 ps ,我什么也没想出来。
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多