我对此进行了一些搜索,但似乎没有找到任何有用的东西。
我的 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
如果
- /usr/lib/pm-utils/sleep.d 中的脚本可以检查应用程序是否正在运行,并返回 1 来指示应防止挂起。
- “系统自动放弃挂起,而不是在 30 分钟后再次尝试”的问题可以通过移动鼠标重新启动计时器来解决(我希望我理解了你的意思)
那么为什么不在应用程序终止后摇动鼠标指针呢?
总结一下:
- 使用 sleep.d 来防止系统挂起。
- 编写一个摇动鼠标一次的脚本。
- 调用“长时间运行的脚本 && 鼠标摇动”
这不会妨碍屏幕保护程序。
唯一的问题是,系统挂起时,进程终止后需要 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 上,并在执行此操作时抑制系统睡眠、关机和空闲。