解決したいこと
動作確認時、フルパスでシェルスクリプトを実行した場合は二重起動防止が働くが、
(sh /usr/local/test/20_test.sh)
カレントディレクトリを省略してシェルスクリプトを実行すると二重起動防止が働かない。
(sh 20_test.sh)
(./20_test.sh)
※どちらも"cd /usr/local/test/"で対象シェルのカレントディレクトリに移動済み。
背景
◆対象シェルスクリプトに二重起動防止を追加し、二重起動防止が機能しているか動作確認で以下のテストを行った。
(環境はTeraterm)
- 対象のシェルスクリプトを手動で実行後、5秒後にまた手動で実行する。
- 対象のシェルスクリプトをcronで実行後、5秒後に手動で実行する。
- 対象のシェルスクリプトを手動で実行後、5秒後にcronで実行する。
◆各テスト結果の確認は以下を判断にした。
- エラーログが吐き出され、タイムスタンプが実行時であること。
$ 2021/06/18 13:30:01 既に実行中です。
2. 実行ログのタイムスタンプが実行時であり、実行完了までログがダブってないこと。
$ 2021/06/18 13:29:55 【実行開始】
・
・
・
$ 2021/06/18 13:30:09 【実行終了】
対象のシェルスクリプトは以下になる。
#!/bin/bash # 自シェルのパスを取得 export BASE_DIR=$(cd $(dirname $0); pwd) #環境情報読み込み source ${BASE_DIR}/conf/environment.conf [ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR} [ ! -d ${TEMP_DIR} ] && mkdir ${TEMP_DIR} #二重で起動していないかチェックする(動作確認用にエラー時ログを吐き出す) if [ $$ != `pgrep -fo $0` ] ; then echo `date '+%Y/%m/%d %H:%M:%S'`" 既に実行中です。" | tee /usr/local/test/error.log exit 1 fi # 実行内容 echo "teratail用に変えたけど実際は色々動いてるよ。"
cronでの設定内容は以下になる。設定している時間はテスト用。
cronの内容
1#二重起動防止_動作テスト用 230 13 * * * /usr/local/test/20_test.sh
手動実行時、フルパスでシェルスクリプトを実行する分には二重起動防止の機能が働くことは証明できたが、実際に運用する作業員がシェルスクリプト実行時に"./20_test.sh"で実行するのでなるべく作業員の意に沿って実装したいのでお力をお貸し下さい。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/21 04:35