无人登录时如何运行维护脚本?

Posted

技术标签:

【中文标题】无人登录时如何运行维护脚本?【英文标题】:How to run maintenance script when nobody is logged in? 【发布时间】:2018-07-25 08:10:36 【问题描述】:

我必须在 ubuntu 服务器上为硬盘运行维护脚本(创建一些索引并执行一些数据科学魔术)。为了运行脚本,我有两个要求:

没有用户登录(root 可能是一个例外,但我还不确定) 硬盘上的 IO 为 0(或几乎为 0)

该脚本可能需要运行数周/数月,以便在任何人登录时脚本不应运行,因为它不应干扰其他人的工作,并且不应在任何应用程序已在使用硬盘驱动器时运行,以便它们没有减速。

我曾考虑使用 crontab 每分钟检查是否有用户登录并检查硬盘 IO,但我不确定如何处理,因为当有人登录时需要停止脚本。作为脚本它本身也会在硬盘驱动器上产生 IO(因此在检查中它会大于 0)我需要将完整的硬盘驱动器 IO 与脚本产生的 IO 进行比较。

任何帮助将不胜感激:-)

更新:

目前我正在考虑连续运行类似的东西:

if [ -z "$(who)" ]
then
  # check whether already running
  if [ -z "$ps aux | grep "superAwesomeScript.sh"" ]
  then
    bash superAwesomeScript.sh
  fi
else
  pkill -f superAwesomeScript.sh
fi

IO 检查缺失,但没有更好的方法吗?

【问题讨论】:

【参考方案1】:

我认为您正在寻找的是service。他们通常在后台连续运行并做他们的事情。您可以在 /etc/init.d 中查找脚本以获取示例。

然后,您将不得不阅读一些有关您的 ubuntu 版本使用的服务系统的信息。即 18.04 使用 systemd

虽然它们不能解决您的确切问题,但它们最终会让您启动并运行。

目前登录用户数可以用bash查询,比简单who的anylisis简单一点:

who -qs | grep -o '[0-9]\+'

它会返回一个数字,而不是“简单地”输出整个输出

【讨论】:

【参考方案2】:

试试nohup,我想这正是你所需要的

https://linux.die.net/man/1/nohup
https://linux.die.net/man/1/ionice
https://linux.die.net/man/1/nice

例如

nohup ./custom-script.sh &

使用nicereniceionice 为脚本赋予最低优先级

【讨论】:

如果我理解正确,那么 nohup 不会检查是否有人登录以及资源是否已在使用中。我目前正在考虑持续运行脚本(请参阅初始问题中的编辑)。 对不起,我没有看到更新,现在我明白了,我仍然会在后台运行它并使用nice(进程友好)和ionice(io 友好)来保留它作为低优先级。希望能满足你的要求。

以上是关于无人登录时如何运行维护脚本?的主要内容,如果未能解决你的问题,请参考以下文章

在没有用户登录的情况下在 Windows 启动时运行脚本

硒;如何运行多个实例并维护不同的会话

Tableau server 日常维护13 Tableau server 升级

SQL 维护脚本

Shell-运行OSX维护脚本

确定上次运行OS X';的维护脚本的时间