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を実行という感じです
簡単な多重起動防止ですが、これが結構ちゃんと動いてくれます
お困りの方はお試しあれ