Nous avons des versions assez longues pour lesquelles nous planifions généralement nos tâches cron, mais à l'occasion, nous devons réexécuter une génération pendant une période non standard et nous pouvons rencontrer des conflits avec des tâches cron qui sont généralement sûres à exécuter à ces moments.
Nous avons plusieurs comptes qui exécutent à la fois les builds et les tâches cron, nous ne pouvons donc pas suspendre le service crontab pour la machine entière, puis le redémarrer plus tard.
Je me demandais si quelqu'un avait un modèle ou une implémentation. J'imagine que ça marche comme
L'utilisateur crée un fichier: ~ / block-crontab l'
utilisateur exécute la construction Le travail cron recherche ce fichier dans le répertoire personnel de l'utilisateur et s'il y en a, il ignore simplement tous les travaux cron. Sinon, il exécute les travaux. Ensuite, lorsque la construction est terminée, l'utilisateur supprime ~ / block-crontab
Cela fonctionnerait-il? Je suppose que je devrais modifier le script cron d'une manière ou d'une autre. Je me demande surtout s'il existe une approche meilleure / standard à ce problème?
Merci.
la source
[the build] can run into conflicts with from jobs that are tipically safe to run at those times
? Y a-t-il des travaux non générés qui ne peuvent pas s'exécuter pendant la génération? Tous les emplois s'excluent-ils mutuellement? Ou tout simplement en ce qui concerne la construction?flock
ourun-one
(Debian / Ubuntu)? serverfault.com/questions/82857/…Réponses:
Plutôt que de jouer avec
crond
, je suggère fortement d'implémenter une forme (même simple) de verrouillage à l'intérieur de vos scripts de construction. Par exemple, touchez et recherchez un fichier dans/var/run/
: si votre script trouve quelque chose, un autre processus construit le projet. Vous devez évidemment supprimer le fichier de verrouillage lorsque vous avez terminé.Comme @GnP l'a noté dans les commentaires, vous pouvez également utiliser l'
flock
utilitaire pour gérer semi-automatiquement vos fichiers de verrouillage.Si vous ne comptez / ne pouvez pas compter sur un mécanisme de verrouillage, lancez simplement a
service crond stop
pour arrêter lecrond
système.la source
flock
commande serait un bon ajout à cette réponse. Il gère le fichier de verrouillage et tous les petits détails qu'il contient.flock
le descripteur de fichier est hérité des processus enfants, sauf si vous effectuez un mouvement pour le fermer. Cela peut parfois provoquer des comportements inattendus, surtout si les gens démarrent des «tâches d'arrière-plan» qui sont exécutées dans cron.J'ai tendance à envelopper toutes les commandes de longue durée dans un écran et
cron
à démarrer l'écran uniquement s'il n'y en a pas déjà une en cours d'exécution.Donc, la ligne suivante
crontab
... se transforme en quelque chose comme ceci:
J'aime cela, car il vous donne également la possibilité de vous attacher à un script en cours d'exécution et de vérifier sa sortie / son état.
Dans votre scénario, vous pouvez
cron
vérifier un autre écran avant d'exécuter une génération, par exempleLorsque vous exécutez une génération manuelle, lancez-vous dans une
screen
première avant d'exécuter le script (veuillez commenter si vous avez besoin d'indications sur la façon de vous connecter / vous déconnecterscreen
. C'est un utilitaire utile - essayez-le si vous n'avez pas encore commencé à l'utiliser)Tapez
screen -S ManualBuild
, appuyez[enter]
et exécutez les commandes que vous souhaitez exécuter.Remarque: Si vous utilisez l'exemple tel que fourni, vous risquez de confondre
cron
si vous avez plus d'une session d'écran avec un nom de "ManualBuild" en cours d'exécution.la source
screen -x ScreenName
et selon votre distribution (paramètres suid pourscreen
), vous pouvez rendre une session d'écran partageable avec d'autres utilisateurs. La manière la plus propre serait d'exécuter ces commandes de build sous un nom d'utilisateur spécifique, je suppose, le même utilisateur qui possède le travail cron.