Dr.*_*ust 1 command-line suspend systemd
最近,我从 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")
Run Code Online (Sandbox Code Playgroud)
然后我使用chmod +x long-job.py. 为了加快测试速度,我org>gnome>settings-daemon>plugins>power>sleep-inactive-ac-timeout使用dconf-editor(通过 Ubuntu 软件安装)设置为 20(秒)。然后我在没有 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 版本。
小智 5
我不确定,但你试过systemd-inhibit吗?它适用于在 systemd 上运行的 Linux 机器(Ubuntu 16.04 就在其中,AFAIK)。
查看联机帮助页man systemd-inhibit以获取帮助。