ユーザーcronジョブのkillまたはon / offスイッチをインストールするための確立されたパターンはありますか?


8

私たちは通常、cronジョブをスケジュールする長めのビルドを持っていますが、非標準の時間枠でビルドを再実行しなければならない場合があり、通常は安全に実行できるcronジョブと競合する可能性があります。

ビルドとcronジョブの両方を実行する複数のアカウントがあるため、マシン全体のcrontabサービスを一時停止して、後で再起動することはできません。

誰かにパターンや実装があるかどうか疑問に思っていました。私はこれが次のように機能すると想像します

ユーザーがファイルを作成する:〜/ block-crontab
ユーザーがビルドを実行するcronジョブはユーザーのホームディレクトリでそのファイルを探し、ファイルがある場合はすべてのcronジョブをスキップします。それ以外の場合はジョブを実行しますビルドが完了すると、ユーザーは〜/ block-crontabを削除します

それはうまくいくでしょうか?どういうわけかcronスクリプトを変更する必要があると思います。この問題に対するより良い/標準的なアプローチがあるかどうか私はほとんど疑問に思っていますか?

ありがとう。


どういう意味[the build] can run into conflicts with from jobs that are tipically safe to run at those timesですか?ビルド中に実行できない非ビルドジョブはありますか?すべての仕事は相互に排他的ですか?それともビルドに関してだけですか?
GnP 2017年

1
イントロflockまたはrun-one(Debian / Ubuntu)を見たことがありますか?serverfault.com/questions/82857/...
ステファンLasiewski

たとえば、AMごとに大きなdb更新を実行します。その後、午後1時間ごとに、フロントページをニュースまたはランダムなアイテムで更新します。dbの更新中に実行すると、フロントページにいくつかの要素が欠落している可能性があります。
Sean

群れやランワンを見ていない。ありがとう。
Sean

回答:


10

をいじるのではなくcrond、ビルドスクリプト内に何らかの(単純な)ロック形式を実装することを強くお勧めします。たとえば、次の場所にあるファイルをタッチしてチェックし/var/run/ます。スクリプトが何かを見つけた場合、別のプロセスがプロジェクトをビルドしています。終了したら、明らかにロックファイルを削除する必要があります。

コメントで@GnPが指摘したように、flockユーティリティを使用してロックファイルを半自動的に管理することもできます。

ロックメカニズムに依存していない/依存できない場合はservice crond stopcrondシステムをシャットダウンするためにa を発行するだけです。


2
flockコマンドは、この答えに素晴らしい追加になります。それはロックファイルとそれにあるすべての細部を処理します。
GnP 2017年

@GnP素晴らしい提案!私はそれに応じて私の答えを更新しました
shodanshok 2017年

1
flockファイル記述子を使用すると、子プロセスを閉じるために何らかの移動を行わない限り、子プロセスに継承されることに注意してください。特にcronで実行される「バックグラウンドジョブ」を開始すると、予期しない動作が発生することがあります。
Matthew Ife

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

それはいい考えです。私は、開発者が一度に数か月間用語ウィンドウを開いたままにするという習慣を破らなければなりません。:)
Sean

ユーザーがセッションを開いたままにした場合screen -x ScreenName、ディストリビューション(のsuid設定screen)に応じて、接続された画面に接続でき、他のユーザーと画面セッションを共有できるようになります。最もクリーンな方法は、これらのビルドコマンドを、cronジョブを所有する特定のユーザー名で実行することです。
trs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.