最近,我运行了一个长时间运行的脚本,该脚本是从 Ubuntu 16.04 x64 中的终端窗口启动的。当我离开系统时,它最终会在我在窗口中配置的 20 分钟后自动暂停System Settings
,这会导致脚本暂停。当我返回系统时,我意识到由于系统已暂停,我执行脚本的几个小时的进度都丢失了。
Don't suspend
一种解决方法是在Power
设置窗口中手动选择System Settings
。这种防止挂起的方法并不令人满意 (1) 因为我经常忘记这样做,并且 (2) 因为它让我屈从于我的系统。
也许有一种更巧妙但仍然需要手动的方式,即使用某种前缀命令,我nosuspend
现在就调用它,用法如下:nosuspend python myscript.py arg1 arg2
。我对这个神秘命令的主要不满是它仍然要求我记得使用它,而且,由于给所有终端命令添加前缀是不合理的,因此必须预测脚本是否需要 1 分钟或 1 小时才能运行,而这种预测可能不正确,从而再次导致时间浪费和沮丧。
理想情况下,解决方案将阻止挂起,直到所有命令从终端窗口运行完成。在某种程度上,我意识到这是不可能的,因为终端窗口内的 bash 进程可能有一个我们可能不想阻止其休眠的子进程,例如,sudo su
在终端窗口中执行的子进程仍在运行,即使我们当前可能没有使用它,因此处于空闲状态,但我们仍然希望系统在 20 分钟后自动挂起。因此,存在定义挂起标准的问题。
我必须指出,有问题的 Python 脚本只有零星的磁盘、网络和几乎没有 CPU 工作,因为它重复了 Python time.sleep() 调用,每次调用最多不到一分钟。因此,我并不是特别寻找仅仅检测磁盘、网络或 CPU 中“相当”静止状态的方法。也许有一种方法可以检测终端子进程的命令是否取得了任何进展根本在一个间隔内(希望与上面配置的间隔相同Power
)。希望这可以将我的脚本与上面的空闲sudo su
反例区分开来。
更新 1(2016 年 9 月 14 日):
按照下面 Adrine Correya 的建议,我尝试了systemd-inhibit
,听起来像nosuspend
上面想象的那样,但没有奏效。这是我做的。首先,我创建了一个名为“long-job.py”的 Python 测试脚本:
#!/usr/bin/python3
import time
print("starting")
for i in range(10):
time.sleep(10)
print("epoch", i)
print("all done")
然后我使用 使其可执行chmod +x long-job.py
。为了加快测试速度,我org>gnome>settings-daemon>plugins>power>sleep-inactive-ac-timeout
使用 将其设置为 20(秒)dconf-editor
(通过 Ubuntu 软件安装)。然后我使用 运行脚本,无需 root/sudo systemd-inhibit ./long-job.py
,但系统在作业完成之前仍然进入睡眠状态(运行大约需要 100 秒,但睡眠发生在 20 秒之后)。我还尝试了一些选项(--what="sleep"
和--what="idle"
),但仍然不起作用。根据手册页,默认值为--what="idle:sleep:shutdown"
。
更新 2 (2016 年 9 月 14 日):
在 Mac OS X 上,似乎caffeinate
确实实现了nosuspend
上述想法;请参阅https://superuser.com/questions/99247/stop-a-mac-from-sleeping-while-a-bash-script-is-running-then-allow-it-to-sleep。同样,如果能实现自动化就更好了,这样我们就不必猜测哪些作业可能会长时间运行。此外,还需要一个 Ubuntu 版本。
答案1
我不确定,但你试过吗systemd-inhibit
?它适用于运行 systemd 的 Linux 机器(据我所知,Ubuntu 16.04 就是其中之一)。
查看手册页man systemd-inhibit
以获取帮助。
答案2
我编写了一个程序 keepawake.py,它可以监控 CPU 活动、网络流量和用户活动(鼠标/键盘)。这可能会解决您的问题。我将其发布在 AskUbuntu 上...
如果您的长时间运行的脚本导致任何网络流量或触发一定百分比的 CPU 活动,那么上述程序可以解决您的问题。