सर्वर बैकअप के लिए शेल स्क्रिप्ट को मुख्य फ़ंक्शन के साथ फिर से लिखा

5 min

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

नमस्ते, मैं अक्षम हूँ।
मैंने कुछ समय पहले लिखे गए बैकअप बनाने के लिए शेल स्क्रिप्ट को फिर से लिखा है।

परिचय

मैंने इसे कुछ समय पहले लिखा था, लेकिन जब मैंने इसे फिर से देखा, तो मुझे एहसास हुआ कि इसमें पुराने बैकअप किए गए tar.gz फ़ाइलों को हटाने के लिए कोड शामिल नहीं था, और यह थोड़ा लंबा होने वाला था, इसलिए मैंने इसे मुख्य फ़ंक्शन में समेट दिया।
मेरे जैसे आलसी व्यक्ति के लिए, इसे यथासंभव संक्षिप्त रखना महत्वपूर्ण है, इसलिए मैंने इसे फिर से लिखा।
वास्तव में, यदि मैं बैकअप गंतव्य और स्रोत को तर्क के रूप में निर्दिष्ट कर सकूँ, तो यह अधिक बहुमुखी होगा और 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 करूँ और माउंट पॉइंट को grep करने पर रिटर्न वैल्यू से निर्णय लूँ, तो यह काफी सटीक होना चाहिए, है ना?

मूल रूप से, मैंने इसे एक बार cp कमांड से कॉपी किया और फिर tar से संपीड़ित किया, लेकिन मैं "कॉपी से बाहर किए जाने वाले फ़ाइलें" निर्दिष्ट करना चाहता था, और ऐसा लगता है कि rsync का उपयोग किया जा सकता है। इसलिए हर कोई rsync का उपयोग कर रहा है।

$W_DIR को विशेष रूप से निर्दिष्ट करने का कारण यह था कि मुझे rsync के लिए एक मान बनाने की आवश्यकता थी।
और मुख्य बात पुराने tar.gz फ़ाइलों को हटाने का निर्धारण है। मैंने इसे आज़माया क्योंकि मुझे लगा कि ls के साथ जाँच करने से find के साथ लालची होकर निचली निर्देशिकाओं में जाने से बचा जा सकता है, जिससे डिस्क I/O पर कम भार पड़ता है और यह सुरक्षित है।
और tail के साथ फ़ाइल नाम प्राप्त करके, आप स्पष्ट रूप से तय कर सकते हैं कि कितनी फ़ाइलों की अनुमति है, जो मुझे लगता है कि काफी अच्छा है।

समाप्ति

ठीक है, ईमानदारी से कहूँ तो मुझे नहीं लगता कि इसे मुख्य फ़ंक्शन में बदलने की इतनी आवश्यकता थी, लेकिन मुझे लगता है कि यह अंततः अधिक पठनीय हो गया है, इसलिए मैं इसे ठीक मानता हूँ।
फिर मिलेंगे।

Related Posts