是否存在用于为用户cron作业安装kill或on / off开关的既定模式?


8

我们的构建很长,通常会安排cron作业,但是有时我们不得不在非标准时间范围内重新运行构建,并且有时会与通常可以安全运行的cron作业发生冲突。

我们有多个同时运行构建和cron作业的帐户,因此我们无法为整个计算机挂起crontab服务,然后在以后重新启动它。

我想知道是否有人有模式或实现。我想这像

用户创建文件:〜/ block-crontab
用户运行build cron作业在用户的主目录中查找该文件,如果存在,则跳过所有cron作业。否则,它将运行作业。然后,在构建完成后,用户删除〜/ block-crontab

那行得通吗?我猜我需要以某种方式修改cron脚本。我主要想知道是否有更好/标准的方法来解决此问题?

谢谢。


你是什么意思[the build] can run into conflicts with from jobs that are tipically safe to run at those times?是否有在构建期间无法运行的非构建作业?所有工作是否相互排斥?还是只考虑构建?
GnP

1
你有没有介绍flockrun-one(于Debian / Ubuntu的)?serverfault.com/questions/82857/...
斯特凡Lasiewski

例如,我们在每个AM上运行一个大的数据库更新。然后,从下午开始的每个小时,我们都会用新闻或随机项目刷新首页。如果在数据库更新期间运行,则首页可能缺少一些元素。
肖恩

没看过羊群或磨合。谢谢。
肖恩

Answers:


10

crond我强烈建议不要在构建脚本中实现某些(甚至简单)锁定形式,而不是搞砸。例如,触摸并检查中的文件/var/run/:如果您的脚本找到了东西,则说明另一个进程正在构建项目。完成后,显然您需要删除锁定文件。

正如@GnP在注释中指出的那样,您还可以使用该flock实用程序半自动管理锁文件。

如果您不/不能依靠任何锁定机制,只需发出a service crond stop即可关闭crond系统。


2
flock命令将是此答案的不错补充。它处理锁定文件及其所有小细节。
GnP

@GnP极好的建议!我已经相应更新了我的答案
shodanshok

1
只要注意,flock文件描述符是由子进程继承的,除非您采取一些措施将其关闭。有时这可能会导致意外的行为,尤其是当人们开始在cron中执行的“后台作业”时。
马修·伊夫

1

我倾向于将所有长时间运行的命令包装在一个屏幕中,并且cron仅当尚未运行一个命令时才开始启动屏幕。

所以下面的行 crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

...变成这样的东西:

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

我喜欢它,因为它还使您有机会附加到正在运行的脚本并检查其输出/状态。

在您的方案中,您可以cron在执行构建之前先检查另一个屏幕,例如

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

当您运行手动构建时,只需screen在运行脚本之前跳到第一个即可(如果需要提示如何连接/断开连接,请添加注释screen。这是一个有用的实用程序-如果尚未开始使用,请试一下)

键入screen -S ManualBuild,然后单击[enter]并运行您要运行的任何命令。

注意:如果使用提供的示例,cron则如果您正在运行多个屏幕会话且名称为“ ManualBuild”,则可能会造成混淆。


抱歉,刚刚看到您的“跨多个用户”记录-未经修改,该功能将无法在所有用户中使用。需要检查屏幕是否以某种方式支持连接到其他用户的会话。
trs

好主意。我不得不打破开发人员的习惯,一次打开几个月的术语窗口。:)
肖恩

如果他们的会话保持打开状态,则可以使用附加到附加的屏幕,screen -x ScreenName并根据您的发行版(的suid设置screen),使屏幕会话可以与其他用户共享。我认为最干净的方法是在拥有cron作业的同一用户下以特定用户名运行这些构建命令。
trs 2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.