如何暂时禁止暂停?

如何暂时禁止暂停?

我对此进行了一些搜索,但似乎没有找到任何有用的东西。

我的 PC 运行的是 Ubuntu 12.10,已设置为 30 分钟不活动后挂起。我不想改变这个设置,大多数时候它都运行良好。

我想要做的是禁用特定应用程序运行时的自动挂起功能。我该怎么做?

到目前为止我发现最接近的方法是添加一个 shell 脚本,/usr/lib/pm-utils/sleep.d检查应用程序是否正在运行并返回 1 来指示应防止挂起。看起来系统会自动放弃挂起,而不是在 30 分钟后再次尝试。(据我所知,如果我移动鼠标,计时器就会重新启动。)应用程序很可能会在几个小时后完成,我宁愿我的电脑自动挂起如果我那时不使用它. (所以我不想在应用程序完成时添加对 pm-suspend 的调用。)

这可能吗?

编辑:正如我在下面的一条评论中指出的那样,我真正想要的是在我的 PC 通过 NFS 提供文件时禁止挂起;我只想关注问题的“挂起”部分,因为我已经有了解决 NFS 部分的想法。使用其中一个答案中给出的“xdotool”想法,我想出了以下脚本,我每隔几分钟从 cron 运行一次。它并不理想,因为它也会阻止屏幕保护程序启动,但它确实有效。我需要看看为什么“caffeine”稍后不能正确地重新启用挂起,然后我可能会做得更好。无论如何,这似乎确实有效,所以我将它包括在这里以防其他人感兴趣。

#!/bin/bash

# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity() {
  /usr/sbin/nfsstat --server --list
}

# Prevent the automatic suspend from kicking in. 
function inhibit_suspend() {
  # Slightly jiggle the mouse pointer about; we do a small step and
  # reverse step to try to stop this being annoying to anyone using the
  # PC. TODO: This isn't ideal, apart from being a bit hacky it stops
  # the screensaver kicking in as well, when all we want is to stop
  # the PC suspending. Can 'caffeine' help?
  export DISPLAY=:0.0
  xdotool mousemove_relative --sync --  1  1
  xdotool mousemove_relative --sync -- -1 -1
}

LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"

echo "Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
  check_activity > "$ACTIVITYFILE1"
  exit 0;
fi

/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"

if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
  echo "No activity detected since last run" >> "$LOG"
else
  echo "Activity detected since last run; inhibiting suspend" >> "$LOG"
  inhibit_suspend
fi

编辑2:上面的脚本有效,但多亏了下面的另一条评论,我现在正在使用这对脚本,它们的优点是允许屏幕保护程序在我禁止挂起时启动。第一个是 /usr/lib/pm-utils/sleep.d/000nfs-inhibit,如果存在禁止文件,它将阻止挂起尝试:

#!/bin/sh

LOG="/home/zorn/log/nfs-suspend-blocker.log"
INHIBITFILE="/home/zorn/tmp/nfs-suspend-blocker.inhibit"

echo "$0: Started run at $(date), arguments: $*" >> "$LOG"
if [ "$1" = "suspend" ] && [ -f "$INHIBITFILE" ]; then
  echo "$0: Inhibiting suspend" >> "$LOG"
  exit 1
fi
exit 0

The second is a modified version of the previous nfs-suspend-blocker script and should still be run from cron. It now follows the strategy outlined in the comment below:

```bash
#!/bin/bash

# This works in tandem with /usr/lib/pm-utils/sleep.d/000nfs-inhibit, which
# will prevent a suspend occurring if $INHIBITFILE is present. Once it prevents
# a suspend, it appears that it requires some "user activity" to restart the
# timer which will cause a subsequent suspend attempt, so in addition to
# creating or removing $INHIBITFILE this script also jiggles the mouse after
# removing the file to restart the timer.

# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity() {
    /usr/sbin/nfsstat --server --list
}

# Slightly jiggle the mouse pointer about; we do a small step and reverse step
# to try to stop this being annoying to anyone using the PC.
function jiggle_mouse() {
  export DISPLAY=:0.0
  xdotool mousemove_relative --sync --  1  1
  xdotool mousemove_relative --sync -- -1 -1
}

LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
INHIBITFILE="$HOME/tmp/nfs-suspend-blocker.inhibit"

echo "$0: Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
  check_activity > "$ACTIVITYFILE1"
  exit 0;
fi

/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"

if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
  echo "$0: No activity detected since last run" >> "$LOG"
  if [ -f "$INHIBITFILE" ]; then
    echo "$0: Removing suspend inhibit file and jiggling mouse" >> "$LOG"
    /bin/rm "$INHIBITFILE"
    jiggle_mouse
  fi
else
  echo "$0: Activity detected since last run; inhibiting suspend" >> "$LOG"
  touch "$INHIBITFILE"
fi

答案1

让你的计算机保持唤醒状态的程序是咖啡因。我会创建一个 .bash_aliases 文件,以便在调用原始代码时也调用 caffeine。

alias newname="origcode && caffeine"

根据您要让计算机保持唤醒状态的代码,您必须制作一个自定义脚本,其中包括在其他代码停止时关闭咖啡因。有关特定代码的更多详细信息将有所帮助。

更新:一个更简单的方法是运行工具,可以使用 进行安装sudo apt-get install xdotool。您可以编写一个脚本,在打开目标代码时调用该脚本,然后使用该sleep命令 29 分钟,然后运行xdotool key a或执行任意操作以保持计算机处于唤醒状态。

答案2

如果

  1. /usr/lib/pm-utils/sleep.d 中的脚本可以检查应用程序是否正在运行,并返回 1 来指示应防止挂起。
  2. “系统自动放弃挂起,而不是在 30 分钟后再次尝试”的问题可以通过移动鼠标重新启动计时器来解决(我希望我理解了你的意思)

那么为什么不在应用程序终止后摇动鼠标指针呢?

总结一下:

  1. 使用 sleep.d 来防止系统挂起。
  2. 编写一个摇动鼠标一次的脚本。
  3. 调用“长时间运行的脚本 && 鼠标摇动”

这不会妨碍屏幕保护程序。

唯一的问题是,系统挂起时,进程终止后需要 30 分钟。您的“EDIT”解决方案也是如此。

附言:当我从此页面了解到 xdotool 时,我正在寻找类似问题的解决方案。所以,谢谢。希望这能有所帮助。

答案3

只需提取出满足我需求的核心技巧,我就会得到以下内容:/usr/local/bin/nosleep我有这个脚本:

#!/bin/bash
export DISPLAY=:0.0
while true; do xdotool mousemove_relative --sync --  1  1 ; xdotool mousemove_relative --sync -- -1 -1; sleep 60; done

这非常方便!我甚至看不到它的工作情况,所以我将“1”改为“100”,并在调用sleep 2;之间添加了一个xdtool,只是为了验证它是否有效。它确实有效。

答案4

Systemd 通过以下方式支持此功能systemd-抑制命令。本页的示例:

# systemd-inhibit wodim foobar.iso

这将使用 wodim(1) 将 ISO 映像 foobar.iso 刻录到 CD 上,并在执行此操作时抑制系统睡眠、关机和空闲。

相关内容