rcloneをcronで多重起動しないようにした(修正済み)

S3からGoogleDriveとか、そのまた逆とか、クラウドストレージ間のファイルコピーは何かと便利なのですが、rcloneをcronで動かした時に多重起動して面倒だったので解決したメモです

ここから説明をする上で前提として以下の環境で実施

・EC2上のUbuntu Server 18.04

・rcloneインストール済み

・Amazon S3からGoogleDriveへコピー

以上となります。

では実際の内容は以下の通りです。

1) rcloneフォルダを作成し、中にrclone.shを作る。

homeディレクトリのどこでもいいので、rcloneってフォルダを作成して、rclone.shを作成します

sudo mkdir rclone
cd ./rclone
sudo touch ./rclone.sh
sudo vim ./rclone.sh

rclone.shの中身は以下の通り

#!/bin/bash
if ["$$" = "pgrep -fo rclone.sh" ]; then
echo "Double start!!!"
exit 1
fi
sudo rclone copy S3:バケット名/ GoogleDrive:送り先

一応内容を解説すると、pgrepで実行しているシェルスクリプト(rclone.sh)があるかどうかを判定し、既に実行中の場合はechoで時刻を表示して動作を終了

そうでない場合は、後段のrclone処理を実行するという運び

なので、このスクリプトの中で書き換える箇所は、rclone copyより後ろの部分だけです

なお、1回目にAのコピーをして、2回目にBのコピーをするという場合は、;(セミコロン)で区切れば1回目と2回目の処理を分ける事が出来ます

#!/bin/bash
if ["$$" = "pgrep -fo rclone.sh" ]; then
echo "Double start!!!"
exit 1
fi
sudo rclone copy S3:バケット名/ GoogleDrive:送り先 ; sudo rclone copy S3:バケット名/ GoogleDrive:送り先

みたいな感じです。

シェルスクリプトに実行権限を付与

続いて、シェルスクリプトに対して実行権限を与えましょう

sudo chmod a+x ./rclone.sh

crontabに登録

最後にcrontabに登録します。

*/1 *   * * *   ユーザー名  if [ "$$" = "`pgrep -fo rclone.sh`" ]; then /home/ユーザー名/rclone/rclone.sh; fi

私の場合は、homeディレクトリの直下にrcloneというフォルダを作成し、その中にあるrclone.shを1分置きに実行しています

念のため、crontabの中でも多重起動を防止するために、pidofでrclone.shを判定し、rclone.shが実行中だったらnullに捨てるようにしています

そうでない場合はrclone.shを実行という感じです
簡単な多重起動防止ですが、これが結構ちゃんと動いてくれます

お困りの方はお試しあれ