🎃

cronから実行されるツールの排他制御をcrontabに書いてしまいたい

2022/02/17に公開約1,500字

crontabへflockコマンドを直で書いて排他制御しちゃいたい時。

環境

CentOS 7.9

例のため、sleepだけ書いたシェルを書き置きます。

  • /opt/tools/gori.sh
#!/bin/bash
sleep 120
  • lockファイルを作成しておきます。
touch /opt/tools/gori.lock && chattr +i $_
  • crontab へ記述
* * * * * flock -xn /opt/tools/gori.lock -c '/opt/tools/gori.sh'

「-x」でgori.lock のロックを取得しにいき、「-n」で取得できない場合は終了させる。
「-c」で実行したいコマンドやツールを渡す。

  • オプションについて

https://ysatoautonomous.github.io/jm-draft/man2html/util-linux/util-linux-2.34/draft/man1/flock.1.html

crond実行ログを見ると、毎分 gori.sh が叩かれています。

Feb 18 01:52:01 work005 CROND[6870]: (root) CMD (flock -xn /opt/tools/gori.lock -c '/opt/tools/gori.sh')
Feb 18 01:53:01 work005 CROND[6953]: (root) CMD (flock -xn /opt/tools/gori.lock -c '/opt/tools/gori.sh')

が、pid 6870 のgori.shが終了しておらず。ロックが解放されないため、
1分後に発行された pid 6953 のgori.shは実行されません。
以下のように pid 6870 の処理のみが継続されることになります。

root      5221     1  0 01:34 ?        00:00:00 /usr/sbin/crond -n
root      6868  5221  0 01:52 ?        00:00:00  \_ /usr/sbin/CROND -n
root      6870  6868  0 01:52 ?        00:00:00      \_ flock -xn /opt/tools/gori.lock -c /opt/tools/gori.sh
root      6871  6870  0 01:52 ?        00:00:00      |   \_ /bin/bash /opt/tools/gori.sh
root      6873  6871  0 01:52 ?        00:00:00      |       \_ sleep 120
open("/opt/tools/gori.lock", O_RDONLY|O_CREAT|O_NOCTTY, 0666) = 3
flock(3, LOCK_EX|LOCK_NB)               = -1 EAGAIN (リソースが一時的に利用できません)
close(1)                                = 0
close(2)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++

Discussion

ログインするとコメントできます