LoginSignup
0
0

More than 3 years have passed since last update.

setlockしたプロセスを自動で開放したい話

Last updated at Posted at 2021-05-05

はじめに

cronでPythonプロセスの自動起動を実装していたときのこと。
定期的にプロセスが止まっていないか確認しつつ、多重起動は防止するような仕組みを以下のように実装しました。

#!/bin/sh
* * * * * setlock -xn /hoge/huga/locklock.lock /usr/bin/python3 /hoge/huga/pypy.py >> /hoge/huga/loglog.log 2>&1

問題発生

ところがここで起こった問題が一つ。

/hoge/huga/pypy.pyが更新される度にプロセスを再起動させたかったのですが、丁度その時にプロセスが起動中だった場合、/hoge/huga/locklock.lockはロックされたままなので再起動ができません。

この時、私が起動させていたPythonプログラムは無限ループで起動し続けるプログラムだったので、/hoge/huga/locklock.lockのロックに阻まれて再起動ができない!というような状況に陥りました。

解決策

再起動前にこんな感じのシェルを実行させることで解決しました。

$ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' | sh

解説

していることは簡単で、以下のような感じです。

1. lslocksでロックされているファイルを一覧表示

$ lslocks

# 出力
# COMMAND           PID  TYPE SIZE MODE  M START END PATH
# ...
# (unknown)        1234 FLOCK      WRITE 0     0   0 /run...
# cron             3932 FLOCK   5B WRITE 0     0   0 /run/crond.pid
# python3          5432 FLOCK      WRITE 0     0   0 /hoge/huga/locklock.lock
# ...

2. grepで対象のファイルの行を抽出

$ lslocks | grep /hoge/huga/locklock.lock

# 出力
# python3          5432 FLOCK      WRITE 0     0   0 /hoge/huga/locklock.lock

3. awkで対象のファイルをロックしているプロセスを削除するコマンドを生成

$ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }'

# 出力
# kill -9 5432

4. shで実行

$ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' | sh

おわりに

書くことが思いつかなかったので解決策のシェルを再掲しておきます。

$ lslocks | grep /hoge/huga/locklock.lock | awk '{ print "kill -9", $2 }' | sh
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0