সার্ভারের ব্যাকআপের জন্য শেল স্ক্রিপ্টটি main ফাংশন ব্যবহার করে পুনরায় লিখলাম

5 min

language: ja bn en es hi pt ru zh-cn zh-tw

নমস্কার, আমি মুনো।
কিছুদিন আগে লেখা ব্যাকআপ তৈরির জন্য শেল স্ক্রিপ্টটি আমি আবার লিখেছি।

ভূমিকা

আমি এটি কিছুদিন আগে লিখেছিলাম, কিন্তু যখন আবার দেখলাম, তখন বুঝতে পারলাম যে আমি পুরানো ব্যাকআপ করা tar.gz ফাইলগুলি মুছে ফেলার জন্য কোড অন্তর্ভুক্ত করিনি, এবং আমি ভেবেছিলাম এটি কিছুটা দীর্ঘ হতে পারে, তাই আমি এটিকে একটি main ফাংশনে একত্রিত করেছি।
আমার মতো অলস মানুষের জন্য, এটিকে যতটা সম্ভব সংক্ষিপ্ত রাখা গুরুত্বপূর্ণ, তাই আমি এটি আবার লেখার চেষ্টা করেছি।
আদর্শগতভাবে, যদি আমি আর্গুমেন্ট ব্যবহার করে ব্যাকআপের গন্তব্য এবং উৎস নির্দিষ্ট করতে পারতাম, তবে এটি আরও বহুমুখী হত এবং cron-এ লেখার সময় বুঝতে সহজ হত, তাই আমি এটি পরে করব।

বিশ্লেষণ

#!/bin/bash

MOUNT_DIR="/your/mount/point"

SRC_DIR="/want/to/backup/dir"
BK_DIR="backupdir"

EXCLUDE_FILE=""  # 除外ファイル指定 --exclude=your/path
W_DIR=`echo $SRC_DIR | awk -F/ '{print $(NF)}'`

# マウントポイントを確認し、マウントされていなければマウントする
check_mount() {
    df | grep "$MOUNT_DIR" > /dev/null
    if [ $? -ne 0 ]; then
        break
    else
        mount $MOUNT_DIR || exit 1
    fi
}

# 古いバックアップファイルを削除する
rm_old_backups() {
    BK_COUNT=`ls -1 $MOUNT_DIR/$BK_DIR/*.tar.gz 2>/dev/null | wc -l`
    if [ "$BK_COUNT" -ge 3 ]; then
        ls -1t $MOUNT_DIR/$BK_DIR/*.tar.gz | tail -n +4 | while read file; do
            rm -f "$file"
        done
    fi
}

# バックアップを作成する
create_backup() {
    rsync -av $EXCLUDE_FILE $SRC_DIR $MOUNT_DIR/$BK_DIR
    tar cfz $MOUNT_DIR/$BK_DIR/"$W_DIR"_`date +"%Y%m%d"`.tar.gz -C $MOUNT_DIR/$BK_DIR $W_DIR
    rm -rf $MOUNT_DIR/$BK_DIR/$W_DIR/*
}

main() {
    check_mount  # マウントを確認し、必要ならマウント
    mkdir -p $MOUNT_DIR/$BK_DIR  # バックアップディレクトリの作成
    rm_old_backups  # 古いバックアップの削除
    create_backup  # 新しいバックアップの作成
    umount $MOUNT_DIR || exit 1  # マウント解除
}

main

যেহেতু আমি মাউন্ট/আনমাউন্ট করার কথা ভাবছি, তাই সেই চেকটি অন্তর্ভুক্ত করা প্রয়োজন ছিল, এবং অদ্ভুতভাবে, mountpoint কমান্ড ব্যবহার করে এটি মাউন্ট করা হয়েছে কিনা তা পরীক্ষা করার একটি উপায় আছে, কিন্তু যখন আমি এটি চেষ্টা করেছিলাম, তখন এটি কখনও কখনও "মাউন্ট করা হয়নি" দেখাতো যদিও এটি মাউন্ট করা ছিল, এবং আমি সঠিক রিটার্ন ভ্যালু পাইনি।
তাই, হঠাৎ আমার মনে হল, যদি এটি মাউন্ট করা না থাকে, তবে এটি df ফলাফলে দেখা যাবে না, তাই যদি আমি df-এর স্ট্যান্ডার্ড আউটপুট grep করি এবং মাউন্ট পয়েন্ট খুঁজে পেলে রিটার্ন ভ্যালু পরীক্ষা করি, তবে এটি বেশ নির্ভরযোগ্য হওয়া উচিত।

মূলত, আমি প্রথমে cp কমান্ড দিয়ে একবার কপি করে তারপর tar দিয়ে কম্প্রেস করতাম, কিন্তু আমি "কপি থেকে বাদ দেওয়া ফাইল" নির্দিষ্ট করতে চেয়েছিলাম, এবং মনে হচ্ছে rsync এর জন্য ব্যবহার করা যেতে পারে। এই কারণেই সবাই rsync ব্যবহার করছে।

$W_DIR নির্দিষ্টভাবে উল্লেখ করার কারণ হল এটি rsync দ্বারা ব্যবহৃত হয়, তাই মানটি তৈরি করার প্রয়োজন ছিল।
এবং মূল বিষয়টি হল পুরানো tar.gz ফাইলগুলি মুছে ফেলার সিদ্ধান্ত; যদি আমি ls দিয়ে পরীক্ষা করি, তবে find দিয়ে লোভের সাথে সাবডিরেক্টরিগুলিতে দেখতে হবে না, তাই আমি মনে করেছি এটি ডিস্ক I/O-এর উপর কম চাপ সৃষ্টি করবে এবং নিরাপদ হবে, তাই আমি এটি চেষ্টা করেছি।
tail দিয়ে ফাইলের নামগুলি পাওয়ার মাধ্যমে, আমি স্পষ্টভাবে সিদ্ধান্ত নিতে পারি যে কতগুলি ফাইলকে অনুমতি দেওয়া হবে, এবং আমি মনে করি এটি বেশ ভাল, তাই না?

উপসংহার

সত্যি বলতে, আমার মনে হয় না যে এটিকে একটি main ফাংশনে রাখার প্রয়োজন ছিল, তবে আমি মনে করি এর ফলে এটি পড়তে সহজ হয়েছে, তাই আমি এটিকে ভাল বলে মনে করব।
এই পর্যন্তই। আবার দেখা হবে।

Related Posts