آموزش استفاده از Rsync برای همگامسازی دایرکتوریهای محلی و ریموت

مقدمه
Rsync که مخفف remote sync (همگامسازی ریموت) است، یک ابزار خط فرمان برای همگامسازی فایلها و دایرکتوریها بهصورت محلی و ریموت است. این ابزار از الگوریتم انتقال دلتا (Delta-Transfer) استفاده میکند تا میزان داده کپیشده را با جابهجا کردن فقط بخشهای تغییرکرده فایلها کمینه کند؛ که آن را برای کارهایی مانند بکاپگیری و میرور کردن فوقالعاده کارآمد میسازد.
در این راهنما یاد میگیرید چطور از rsync برای وظایف مختلف مدیریت فایل استفاده کنید. سینتکس پایه آن، نحوه انتقال فایل به و از سرور ریموت و استفاده از گزینههای رایج مانند --delete برای میرور کردن و --dry-run برای تست امن را پوشش میدهیم. همچنین یاد میگیرید چطور انتقالها را با cron خودکار کنید و مشکلات پرتکرار را عیبیابی کنید.
اپلیکیشنهای فرانتاند خود را از گیتهاب روی زیرساخت ابری پارمین کلود دیپلوی کنید و مقیاسپذیری و مدیریت زیرساخت را به پارمین کلود بسپارید.
نکات کلیدی
- rsync یک ابزار همگامسازی فایل است که دایرکتوریهای محلی و ریموت را با انتقال فقط بخشهای تغییرکرده فایلها، بهشکل کارآمد کپی میکند.
- اسلش انتهایی (
/) روی مسیر مبدأ (Source) حیاتی است؛ چون تعیین میکند rsync محتوای دایرکتوری را کپی کند یا خود دایرکتوری را. - همیشه دستورات rsync را با فلگ
--dry-runیا-nتست کنید تا نتیجه را بدون اعمال هیچ تغییر واقعی روی فایلها پیشنمایش کنید. - فلگ
-a(آرشیو) برای بیشتر موارد استفاده توصیه میشود؛ چون همزمان با حفظ مجوزها، مالکیت و زمانهای تغییر، بهصورت بازگشتی همگامسازی میکند. - برای ساخت یک میرور واقعی، از گزینه
--deleteاستفاده کنید تا فایلهایی که دیگر در دایرکتوری مبدأ وجود ندارند از مقصد (Destination) حذف شوند. - برای انتقالهای ریموت، فلگ
-zداده فایلها را فشرده میکند تا مصرف شبکه کم شود و فلگ-Pهم پیشرفت را نشان میدهد و اجازه ادامه انتقالهای قطعشده را میدهد. - rsync برای عملیاتهای امن ریموت از SSH استفاده میکند و به شما امکان میدهد فایلها را به یک سیستم ریموت «پوش (Push)» یا از آن «پول (Pull)» کنید.
- میتوانید وظایف همگامسازی را با cron خودکار کنید؛ که نیازمند استفاده از مسیرهای مطلق در دستورتان و پیکربندی احراز هویت کلید SSH بدون رمز عبور است.
پیشنیازها
برای تمرین استفاده از rsync در همگامسازی فایلها بین یک سیستم محلی و ریموت، به دو ماشین نیاز دارید که بهترتیب نقش کامپیوتر محلی و ماشین ریموت شما را بازی کنند. این دو ماشین میتوانند سرور مجازی خصوصی (VPS)، ماشین مجازی، کانتینر یا کامپیوتر شخصی باشند؛ تا وقتی که درست پیکربندی شده باشند.
اگر قصد دارید این راهنما را با استفاده از سرورها دنبال کنید، عاقلانه است که آنها را با کاربران مدیریتی راهاندازی کنید و روی هر کدام فایروال پیکربندی کنید. برای راهاندازی این سرورها، راهنمای راهاندازی اولیه سرور در پارمین کلود را دنبال کنید.
مستقل از اینکه از چه نوع ماشینهایی برای دنبال کردن این آموزش استفاده میکنید، باید روی هر دوی آنها کلیدهای SSH ساخته باشید. سپس کلید عمومی هر سرور را به فایل authorized_keys سرور دیگر کپی کنید؛ طبق آنچه در گام ۲ راهنمای مذکور (کپی کلید عمومی به سرور اوبونتوی شما) توضیح داده شده است.
تعریف Rsync
Rsync یک ابزار خط فرمان طراحیشده برای همگامسازی کارآمد فایل و دایرکتوری است. میتوان از آن برای کپی داده بین دایرکتوریهای یک ماشین منفرد یا بین ماشینهای مختلف متصل از طریق شبکه استفاده کرد. بهدلیل قابلیت اطمینان و چندکاره بودنش، بهطور پیشفرض روی بیشتر سیستمعاملهای لینوکسی و شبهیونیکسی گنجانده شده است.
قابلیت اصلی که rsync را از ابزارهایی مثل cp یا scp متمایز میکند، استفاده از الگوریتم انتقال دلتاست. قبل از انتقال، rsync فایلهای مبدأ و مقصد را مقایسه میکند. بهطور پیشفرض، تغییرات را با بررسی زمانهای تغییر و حجم فایلها شناسایی میکند. اگر فایلی تغییر کرده باشد، الگوریتم تعیین میکند کدام بخشهای مشخص فایل تغییر کردهاند و فقط همان تفاوتها را میفرستد. در مقابل، scp و cp هر بار کل فایل را کپی میکنند. این روش انتقال دلتا، میزان داده منتقلشده را بهطور چشمگیری کاهش میدهد و rsync را برای همگامسازیهای بعدی یا هنگام بهروزرسانی فایلهای بزرگ با تغییرات کوچک، فوقالعاده سریع میکند.
این کارایی، rsync را به ابزاری ایدهآل برای انواع وظایف تبدیل میکند؛ از جمله ساخت بکاپهای افزایشی (Incremental)، میرور کردن کل ساختار دایرکتوریها برای افزونگی (Redundancy) و دیپلوی کد اپلیکیشن. rsync برای انتقالهای امن ریموت روی SSH عمل میکند و مجموعه غنیای از گزینهها ارائه میدهد—مثل --delete برای میرور کردن و --exclude برای فیلترینگ—که کنترل دقیقی روی فرایند همگامسازی به کاربران میدهد.
درک سینتکس Rsync
سینتکس rsync شبیه ابزارهای دیگر، مانند ssh، scp و cp عمل میکند.
اول، با اجرای دستور زیر به دایرکتوری خانهتان بروید:
cd ~
سپس یک دایرکتوری تستی بسازید:
mkdir dir1
یک دایرکتوری تستی دیگر بسازید:
mkdir dir2
حالا چند فایل تستی اضافه کنید:
touch dir1/file{1..100}
الان یک دایرکتوری به نام dir1 با ۱۰۰ فایل خالی داخلش دارید. با فهرست کردن فایلها تأیید کنید:
ls dir1
Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file50 file6 file69 file78 file87 file95
file14 file23 file32 file41 file51 file60 file7 file79 file88 file96
file15 file24 file33 file42 file52 file61 file70 file8 file89 file97
file16 file25 file34 file43 file53 file62 file71 file80 file9 file99
file17 file26 file35 file44 file54 file63 file72 file80 file9 file99
همچنین یک دایرکتوری خالی به نام dir2 دارید. برای همگامسازی محتوای dir1 به dir2 روی همان سیستم، rsync را با فلگ -r اجرا میکنید که مخفف «بازگشتی» (Recursive) است و برای همگامسازی دایرکتوریها ضروری است:
rsync -r dir1/ dir2
گزینه دیگر، استفاده از فلگ -a است؛ یک فلگ ترکیبی که مخفف «آرشیو» است. این فلگ همگامسازی را بهصورت بازگشتی انجام میدهد و لینکهای سمبولیک، فایلهای خاص و دستگاه، زمانهای تغییر، گروهها، مالکان و مجوزها را حفظ میکند. این فلگ بیشتر از -r استفاده میشود و فلگ توصیهشده است. همان دستور مثال قبلی را اجرا کنید؛ این بار با فلگ -a:
rsync -a dir1/ dir2
لطفاً توجه کنید که در سینتکس دو دستور قبلی، یک اسلش انتهایی (/) در انتهای آرگومان اول وجود دارد که اینجا هایلایت شده است:
rsync -a dir1/ dir2
این اسلش انتهایی نشاندهنده محتوای dir1 است. بدون اسلش انتهایی، dir1 بههمراه خودِ دایرکتوری، داخل dir2 قرار میگرفت. نتیجه سلسلهمراتبی مثل این میساخت:
~/dir2/dir1/[files]
نکته دیگر این است که قبل از اجرای دستور rsync، آرگومانهایتان را دوباره بررسی کنید. rsync روشی برای این کار با پاس دادن گزینههای -n یا --dry-run ارائه میدهد. فلگ -v که یعنی «پرحرف» (Verbose) هم برای گرفتن خروجی مناسب ضروری است. فلگهای a، n و v را در دستور زیر ترکیب میکنید:
rsync -anv dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
حالا این خروجی را با خروجیای که هنگام حذف اسلش انتهایی میگیرید مقایسه کنید؛ مثل زیر:
rsync -anv dir1 dir2
Output
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .
این خروجی حالا نشان میدهد که خودِ دایرکتوری منتقل شده است، نه فقط فایلهای داخل دایرکتوری.
تأکید بر تست با –dry-run برای جلوگیری از اشتباهات
قبل از اجرای هر دستور rsync—بهویژه دستوراتی که مقصدهای ریموت یا گزینههای مخربی مثل --delete دارند—انجام یک اجرای آزمایشی حیاتی است. rsync راهی امن و ساده برای این کار با فلگ --dry-run (یا نسخه کوتاهترش -n) ارائه میدهد.
یک Dry Run کل فرایند همگامسازی را شبیهسازی میکند بدون اینکه هیچ تغییر واقعی ایجاد کند. دقیقاً به شما نشان میدهد کدام فایلها کپی، بهروزرسانی یا حذف میشوند.
برای اجرای Dry Run، کافی است -n را به دستورتان اضافه کنید. اغلب با -v (پرحرف) ترکیب میشود تا فهرست شفاف و خوانایی از اقدامات بگیرید:
rsync -anv --delete source_directory/ destination_directory/
نمونه خروجی Dry Run:
sending incremental file list
deleting old_file.txt
./
new_file.txt
updated_file.txt
sent 218 bytes received 38 bytes 512.00 bytes/sec
total size is 1024 speedup is 4.00 (DRY RUN)
این خروجی به شما میگوید اگر دستور را برای واقعی اجرا کنید، rsync فایل old_file.txt را حذف، فایل new_file.txt را میسازد و فایل updated_file.txt را بهروزرسانی میکند.
همیشه در این موارد Dry Run انجام دهید:
- اولین بار استفاده از فلگ
--deleteبرای یک کار مشخص. - وقتی مجموعه پیچیدهای از قوانین
--includeیا--excludeساختهاید. - وقتی دادهای را به مکان حیاتیای مثل سرور پروداکشن همگام میکنید.
چند ثانیه وقت گذاشتن برای اجرای --dry-run میتواند از دست دادن برگشتناپذیر داده را جلوگیری کند و شما را از اشتباهات پرهزینه نجات دهد.
پوش و پول فایلها: از محلی به ریموت و از ریموت به محلی
برای استفاده از rsync در همگامسازی فایل با یک سیستم ریموت، به دسترسی SSH پیکربندیشده بین ماشینهای محلی و ریموتتان و همچنین rsync نصبشده روی هر دو سیستم نیاز دارید. وقتی تأیید کردید که میتوانید از طریق SSH وصل شوید، میتوانید همگامسازی فایلها را شروع کنید. سینتکس پایه شبیه scp است؛ جایی که مبدأ آرگومان اول و مقصد آرگومان دوم است.
پوش: همگامسازی از ماشین محلی به ماشین ریموت
عملیات «پوش» وقتی است که فایلها را از ماشین محلی خود به یک سرور ریموت میفرستید. این کار معمولاً برای دیپلوی کد اپلیکیشن یا بکاپگیری از دادههای محلی استفاده میشود.
بیایید از دایرکتوری dir1 که قبلاً ساختیم استفاده کنیم؛ همان که ۱۰۰ فایل خالی دارد. این دایرکتوری را به یک سرور ریموت همگام میکنیم. ساختار دستور، دایرکتوری محلی را بهعنوان مبدأ و سیستم ریموت را بهعنوان مقصد قرار میدهد.
در این مثال میخواهیم خودِ دایرکتوری dir1 را منتقل کنیم، نه فقط محتوایش؛ پس اسلش انتهایی را روی مبدأ نمیگذاریم:
rsync -a ~/dir1 username@remote_host:destination_directory
این را تجزیه کنیم:
-a: فلگ آرشیو که بهصورت بازگشتی همگامسازی میکند و مجوزها، زمانهای تغییر و سایر ویژگیها را حفظ میکند.~/dir1: دایرکتوری مبدأ محلی.username@remote_host: اعتبارنامههای سیستم ریموت.:: دونقطهای که اطلاعات هاست ریموت را از مسیر فایل جدا میکند.destination_directory: مکانی روی سرور ریموت که میخواهید فایلها را در آن بگذارید. مثلاً~/آن را در دایرکتوری خانه کاربر ریموت قرار میداد.
بعد از اجرای این دستور، دایرکتوریای به نام dir1 داخل destination_directory روی سرور ریموت وجود خواهد داشت.
پول: همگامسازی از ماشین ریموت به ماشین محلی
عملیات «پول» برعکس را انجام میدهد: فایلها را از یک سرور ریموت بازیابی و به ماشین محلی شما کپی میکند. این برای دانلود لاگهای سرور یا بازیابی بکاپها مفید است.
برای اجرای پول، کافی است مبدأ و مقصد را در دستور معکوس کنید. سیستم ریموت حالا مبدأ است (آرگومان اول) و سیستم محلی مقصد است (آرگومان دوم).
فرض کنید دایرکتوری dir1 بهجای ماشین محلیتان روی سیستم ریموت بود. برای پول کردن آن به ماشین محلیتان، سینتکس این میشد:
rsync -a username@remote_host:/path/to/remote/dir1 /path/to/local/destination
اینجا rsync به remote_host وصل میشود، به دایرکتوری /path/to/remote/dir1 میرود و محتوایش را به /path/to/local/destination روی کامپیوتر محلیتان کپی میکند.
نقش حیاتی اسلش انتهایی در همگامسازی ریموت
درست مثل انتقالهای محلی، اسلش انتهایی (/) روی دایرکتوری مبدأ حیاتی است؛ چون تعیین میکند چه چیزی کپی شود.
مثال «پوش» را دوباره در نظر بگیرید:
rsync -a ~/dir1 remote_host:~/backups: این دستور خودِ دایرکتوری را کپی میکند. نتیجه روی سرور ریموت، دایرکتوری جدیدی در~/backups/dir1است.rsync -a ~/dir1/ remote_host:~/backups: این دستور با اسلش انتهایی، فقط محتوای~/dir1را کپی میکند. فایلها (file1، file2 و غیره) را مستقیماً داخل~/backupsقرار میدهد. خودِ دایرکتوری dir1 در مقصد ساخته نمیشود.
همیشه وجود اسلش انتهایی روی مسیر مبدأتان را دوباره بررسی کنید تا مطمئن شوید دقیقاً همان چیزی را که میخواهید منتقل میکنید. یک تست سریع --dry-run قبل از اجرای انتقال ریموت بهشدت توصیه میشود.
استفاده از گزینههای دیگر Rsync
Rsync گزینههای زیادی برای تغییر رفتار پیشفرض ابزار ارائه میدهد؛ مانند فلگهایی که در بخش قبلی آموختید.
بهبود سرعت و تابآوری انتقال
در حالی که فلگ -a رایجترین است، چند فلگ دیگر میتوانند فرایند انتقال—بهویژه روی اتصالات شبکه—را بهبود ببخشند.
اگر فایلهایی را منتقل میکنید که از قبل فشرده نشدهاند—مثل فایلهای متنی—میتوانید مصرف انتقال شبکه را با افزودن فشردهسازی با گزینه -z کاهش دهید:
rsync -az source destination
فلگ -P هم مفید است. این فلگ فلگهای --progress و --partial را ترکیب میکند. فلگ اول نوار پیشرفت برای انتقالها فراهم میکند و فلگ دوم اجازه ادامه انتقالهای قطعشده را میدهد:
rsync -azP source destination
Output
sending incremental file list
created directory destination
source/
source/file1
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101)
sourcefile10
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101)
source/file100
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101)
source/file11
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101)
source/file12
0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101)
. . .
اگر دستور را دوباره اجرا کنید، خروجی کوتاهشدهای میگیرید؛ چون هیچ تغییری اعمال نشده. این، توانایی Rsync در استفاده از زمانهای تغییر برای تعیین اعمالشدن تغییرات را نشان میدهد:
rsync -azP source destination
Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
فرض کنید زمان تغییر برخی از فایلها را با دستوری مثل زیر بهروز کنید:
touch dir1/file{1..10}
سپس اگر rsync را دوباره با -azP اجرا کنید، در خروجی متوجه میشوید که Rsync چطور هوشمندانه فقط فایلهای تغییرکرده را دوباره کپی میکند:
rsync -azP source destination
Output
sending incremental file list
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file2
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101)
file3
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101)
. . .
میرور کردن دایرکتوریها با –delete
برای نگهداشتن واقعی دو دایرکتوری در حالت همگام، لازم است در صورتی که فایلهایی از دایرکتوری مبدأ حذف شوند، از دایرکتوری مقصد هم حذف شوند. بهطور پیشفرض، rsync هیچ چیزی از دایرکتوری مقصد حذف نمیکند.
میتوانید این رفتار را با گزینه --delete تغییر دهید. قبل از استفاده از این گزینه، میتوانید با -n (گزینه --dry-run) تستی انجام دهید تا از دست دادن داده ناخواسته جلوگیری شود:
rsync -an --delete source destination
فیلترینگ پیشرفته با –exclude و –include
اگر ترجیح میدهید فایلها یا دایرکتوریهای خاصی را که داخل دایرکتوری همگامشوندهتان قرار دارند مستثنی کنید، میتوانید این کار را با قابلیتهای فیلترینگ قدرتمند rsync انجام دهید. نکته کلیدی این است که rsync این قوانین را به همان ترتیبی که ارائه میکنید ارزیابی میکند؛ اولین قانونی که با فایلی مطابقت یابد، همان است که اعمال میشود.
مستثنی کردن فایلها و دایرکتوریها
میتوانید از فلگ --exclude برای جلوگیری از انتقال فایلها یا دایرکتوریهای خاص استفاده کنید. از الگوهای وایلدکارت (*) برای تطبیق چندین فایل استفاده میشود.
مثلاً برای همگامسازی دایرکتوری پروژه همراه با مستثنی کردن فایلهای موقت، فایلهای لاگ و یک دایرکتوری بیلد dist/، این را اجرا کنید:
rsync -av --exclude='*.tmp' --exclude='*.log' --exclude='dist/' source_directory/ destination_directory/
--exclude='*.tmp'همه فایلهای منتهی به .tmp را مستثنی میکند.--exclude='*.log'همه فایلهای منتهی به .log را مستثنی میکند.--exclude='dist/'دایرکتوری dist و محتوایش را مستثنی میکند. اسلش انتهایی تضمین میکند فقط با دایرکتوری تطبیق یابد، نه فایلی به نام dist.
شامل کردن فایلها همراه با مستثنی کردن بقیه
فلگ --include پیچیدهتر است و در کنار --exclude کار میکند. اغلب برای بازنویسی یک مستثنیکردن برای الگوی خاصی استفاده میشود.
مثال قبلی را دقیقتر کنیم. فرض کنید میخواهید همه فایلهای دایرکتوری config/ را مستثنی کنید، بهجز config/production.json. برای رسیدن به این هدف، باید قانون --include را قبل از قانون --exclude قرار دهید:
rsync -av --include='config/production.json' --exclude='config/*' source_directory/ destination_directory/
نحوه پردازش این کار توسط rsync:
- config/production.json را بررسی میکند. قانون
--include='config/production.json'مطابقت مییابد؛ پس rsync این فایل را برای انتقال علامت میزند و پردازش قوانین برایش را متوقف میکند. - سپس فایل دیگری مثل config/development.json را بررسی میکند. قانون include مطابقت نمییابد. به قانون بعدی یعنی
--exclude='config/*'میرود که مطابقت مییابد. فایل مستثنی میشود.
اگر ترتیب معکوس بود، --exclude='config/*' اول با همه فایلهای دایرکتوری config مطابقت مییافت و قبل از اینکه قانون --include اصلاً فرصت ارزیابی پیدا کند، مستثنی میشدند.
ساخت بکاپ با –backup
در نهایت، گزینه --backup در Rsync را میتوان برای ذخیره بکاپ فایلهای مهم استفاده کرد. این گزینه در کنار گزینه --backup-dir استفاده میشود که دایرکتوری ذخیره فایلهای بکاپ را مشخص میکند. وقتی فایلی در مقصد بهروزرسانی یا حذف میشود، نسخه قدیمی ابتدا به دایرکتوری بکاپ مشخصشده منتقل میشود:
rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
خودکارسازی انتقالها با Cron Jobs
میتوانید وظایف rsync را با cron خودکار کنید؛ زمانبند وظایف مبتنی بر زمان که در سیستمعاملهای شبهیونیکسی استاندارد است. cron یک دیمن (پروسه پسزمینه) است که دستورات را در زمانبندیهای از پیش تعریفشده اجرا میکند. این بهویژه برای انجام بکاپهای منظم و بدون نظارت بدون مداخله دستی مفید است.
یک Cron Job، دستور منفردی است که در فایل خاصی به نام crontab تعریف میشود. هر کاربر روی سیستم میتواند crontab خودش را برای زمانبندی کارهایی که با دسترسیهای خودش اجرا میشوند داشته باشد. برای ویرایش crontab مخصوص کاربر خودتان، این دستور را اجرا کنید:
crontab -e
یک ورودی crontab از دو بخش تشکیل میشود: زمانبندی و دستوری که باید اجرا شود. زمانبندی با پنج فیلد تعریف میشود که زمان را با ترتیب خاصی نشان میدهند.
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command_to_execute>
علامت ستاره (*) یک وایلدکارت است؛ یعنی «هر». چند نمونه زمانبندی برای نمایش نحوه کار:
* * * * *– هر دقیقه از هر روز اجرا میشود.30 * * * *– در دقیقه ۳۰ هر ساعت اجرا میشود.0 18 * * 1-5– هر روز کاری (شنبه تا جمعه) ساعت ۱۸:۰۰ اجرا میشود.0 4 * * 0– هر یکشنبه ساعت ۴ صبح اجرا میشود.*/15 * * * *– هر ۱۵ دقیقه اجرا میشود.
مثال: بکاپ روزانه
بیایید یک Cron Job بسازیم که هر روز ساعت ۳ صبح rsync را برای بکاپگیری از یک دایرکتوری محلی (/var/www/html) به یک سرور بکاپ ریموت اجرا کند.
خط زیر را به crontab خودتان اضافه کنید:
0 3 * * * rsync -a --delete /var/www/html/ user@remote_host:/path/to/backups/
- زمانبندی (
0 3 * * *): این یعنی «در دقیقه ۰ از ساعت ۳، هر روز، هر ماه، هر روز هفته». - دستور (
rsync...): این همان دستور استاندارد rsync برای میرور کردن یک دایرکتوری است.
بهترین روشها برای rsync در Cron Jobها
هنگام اجرای دستورات از طریق cron، مهم است به یاد داشته باشید که آنها در یک محیط شل غیرتعاملی و مینیمال اجرا میشوند. برای قابل اطمینان کردن وظایف خودکار rsync، این بهترین روشها را دنبال کنید:
استفاده از مسیرهای مطلق: cron متغیر محیطی PATH مشابه شل کاربر عادی شما ندارد. یعنی ممکن است نداند فایل اجرایی rsync کجاست. همیشه از مسیر کامل به فایلهای اجرایی و دایرکتوریها استفاده کنید. میتوانید مسیر rsync را با اجرای which rsync پیدا کنید (اغلب /usr/bin/rsync است). به همین ترتیب، بهجای ~/ از /home/user/ استفاده کنید.
احراز هویت کلید SSH: یک Cron Job نمیتواند از شما رمز عبور بپرسد. قبل از خودکار کردن انتقال rsync به یک هاست ریموت، باید احراز هویت کلید SSH بدون رمز عبور را راهاندازی کرده باشید.
مدیریت خروجی و لاگینگ: بهطور پیشفرض، cron هر خروجی دستور را به کاربر مالک crontab ایمیل میزند. برای اجتناب از دریافت ایمیل با هر بار اجرای موفق بکاپ، میتوانید خروجی را مدیریت کنید:
- سرکوب کل خروجی: برای دور ریختن کل خروجی (هم خروجی موفق و هم خطاها)، آن را به
/dev/nullهدایت کنید. این برای کارهای ساده و غیرحیاتی خوب است. سینتکس> /dev/null 2>&1یعنی «خروجی استاندارد را به /dev/null هدایت کن و سپس خطای استاندارد (2) را به همان جای خروجی استاندارد (&1) هدایت کن». - لاگ گرفتن در فایل (توصیهشده): رویکرد مقاومتر، ثبت خروجی در فایل است. به این ترتیب، رکوردی از انتقال دارید و میتوانید برای خطاها آن را مرور کنید. استفاده از
>>خروجی را به فایل لاگ اضافه میکند بهجای اینکه هر بار رویش بنویسد.
عیبیابی مشکلات رایج و بهترین روشها
این بخش راهنمایی مسئلهمحور برای حل رایجترین مشکلات rsync است. هر موضوع یک مشکل پرتکرار را توصیف میکند، نحوه رفع را توضیح میدهد و سپس بهترین روش برای جلوگیری از تکرارش را ارائه میکند.
۱. دستور طبق انتظار رفتار نکرد
مشکل رایج: «دستور rsync من کار غیرمنتظرهای کرد!»
دستوری اجرا کردهاید و نتیجه همان چیزی نبود که میخواستید؛ فایلها حذف شدهاند وقتی نمیخواستید، یا داده در دایرکتوری اشتباهی قرار گرفته است.
مراحل عیبیابی:
برای تشخیص اینکه چه چیزی اشتباه رفته، باید ببینید rsync فکر میکند چه میخواهید بکنید. دستورتان را دوباره اجرا کنید؛ اما این بار فلگهای -anv (آرشیو، Dry Run، پرحرف) را اضافه کنید. این کار گزارشی از اقدامات برنامهریزیشده بدون اعمال هیچ تغییری تولید میکند:
rsync -anv source/ destination/
خروجی پرحرف را با دقت مرور کنید. دقیقاً به شما نشان میدهد کدام فایلها هدفاند؛ که به پیدا کردن غلط تایپی در مسیر یا ایرادی در منطقتان کمک میکند.
بهترین روش: همیشه با –dry-run تست کنید
بهترین راه اجتناب از غافلگیریها، همیشه شبیهسازی قبل از اجرای هر دستوری است که داده را تغییر میدهد. فلگ --dry-run (-n) مهمترین تور امنیتی شماست.
۲. دایرکتوری اضافی ساخته شد
مشکل رایج: «یک دایرکتوری اضافی و ناخواسته روی مقصدم ساخته شد.»
سعی کردهاید محتوای دایرکتوری مبدأ را به backups کپی کنید؛ اما در نهایت یک پوشه اضافی مثل backups/source/ دارید.
مراحل عیبیابی:
این تقریباً همیشه بهدلیل نبود اسلش انتهایی روی مسیر مبدأ است.
- مشکل: دستور شما احتمالاً
rsync -a source backupsبوده. بدون اسلش انتهایی، rsync طوری طراحی شده که خودِ دایرکتوری مبدأ را کپی کند. - راهحل: اسلش انتهایی به مسیر مبدأ اضافه کنید تا فقط محتوایش کپی شود. دستور درست
rsync -a source/ backupsاست.
بهترین روش: تسلط بر اسلش انتهایی (/)
درک اسلش انتهایی بنیادی است. همیشه مسیر مبدأتان را دوباره بررسی کنید: از source/ برای کپی محتوا و از source برای کپی خود دایرکتوری استفاده کنید.
۳. مجوزهای نادرست یا خطاهای «Permission Denied»
مشکلات رایج:
- «مجوزهای فایل، مالکان یا تایماستمپها روی سرور مقصد اشتباهاند.»
- انتقال با خطای Permission denied شکست میخورد.
مراحل عیبیابی:
- برای مجوزهای نادرست: احتمالاً بهجای
rsync -aازrsync -rاستفاده کردهاید. فلگ-rفقط بازگشت را مدیریت میکند، در حالی که-aبرای حفظ مجوزها و سایر متادیتای حیاتی فایل لازم است. - برای «Permission Denied»: این مشکل فایلسیستم است، نه خطای rsync. تأیید کنید کاربرِ اجراکننده دستور، مجوز خواندن روی فایلهای مبدأ و مجوز نوشتن روی دایرکتوری مقصد را دارد.
بهترین روش: از فلگ آرشیو (-a) استفاده کنید
برای تضمین همگامسازی واقعی و دقیق، همیشه از فلگ -a (آرشیو) استفاده کنید. این فلگ مجوزها، مالکیت، زمانهای تغییر و لینکهای سمبولیک را حفظ میکند و تضمین میکند مقصد همانندِ دقیق مبدأ باشد.
۴. فایلهای قدیمی روی مقصد باقی میمانند
مشکل رایج: «فایلها را از مبدأ حذف کردم، اما هنوز روی مقصد هستند.»
سعی دارید دو دایرکتوری را کاملاً میرور نگه دارید؛ اما مقصد با فایلهای قدیمی که دیگر روی مبدأ وجود ندارند شلوغ شده است.
مراحل عیبیابی:
این رفتار پیشفرض و امنِ rsync است. این ابزار فقط فایلها را اضافه یا بهروز میکند. برای اینکه مقصد میرور دقیقی شود، باید صریحاً فلگ --delete را اضافه کنید. این فلگ به rsync میگوید هر فایلی از مقصد که در مبدأ وجود ندارد را حذف کند.
بهترین روش: –delete را عامدانه برای میرور استفاده کنید
درک کنید که rsync بهطور پیشفرض ابزار میرور نیست. فلگ --delete را فقط وقتی استفاده کنید که هدفتان ساخت یک کپی دقیق از مبدأ است و همیشه اول آن را با یک --dry-run جفت کنید تا از دست رفتن تصادفی داده جلوگیری شود.
۵. مشکلات خودکارسازی (Cron Jobها و اسکریپتها)
مشکلات رایج:
- اسکریپت هنگ میکند یا رمز عبور میخواهد.
- Cron Job با خطای «command not found» شکست میخورد.
- انتقال ریموت بهطور غیرمنتظره کند است.
مراحل عیبیابی:
- هنگ کردن/پرامپت رمز عبور: کلیدهای SSH شما برای ورود بدون رمز درست پیکربندی نشدهاند. اتصالتان را دستی تست کنید (
ssh user@remote_host) تا تأیید کنید بدون رمز وصل میشود. - «Command not found»: cron با محیطی مینیمال اجرا میشود. از مسیر مطلق به فایل اجرایی rsync در اسکریپت خود استفاده کنید (مثلاً
/usr/bin/rsync). - انتقالهای کند: اگر داده قابل فشردهسازیای مثل فایلهای متنی منتقل میکنید، فلگ
-zرا برای فعال کردن فشردهسازی همزمان و سرعت بخشیدن به انتقال شبکه اضافه کنید.
بهترین روش: در اسکریپتها صریح باشید
برای خودکارسازی قابل اطمینان، اسکریپتهایتان باید صریح باشند. همیشه از مسیرهای مطلق استفاده کنید، مطمئن شوید احراز هویت کلید SSH بدون رمز کار میکند و خروجیتان را در فایلی برای ممیزی و دیباگ ثبت کنید.
سوالات متداول
۱. چطور یک دایرکتوری محلی را با Rsync به سرور ریموت همگام کنم؟
برای همگامسازی دایرکتوری محلی با سرور ریموت، از دستور rsync با مسیر محلی بهعنوان مبدأ و مسیر ریموت بهعنوان مقصد استفاده کنید. دستور شامل گزینههایی برای حفظ ویژگیهای فایل و فشردهسازی داده حین انتقال است.
دستور استاندارد برای این کار:
rsync -avz /path/to/local/dir/ user@remote_host:/path/to/remote/dir/
تجزیه دستور:
rsync: ابزار خط فرمان.-a(آرشیو): این گزینه متادیتای فایل مانند مجوزها، تایماستمپها و مالکیت را حفظ میکند. خلاصهای مناسب برای چند فلگ (-rlptgoD) است.-v(پرحرف): خروجی تفصیلی با فهرست فایلها هنگام انتقال فراهم میکند.-z(فشردهسازی): داده فایلها را حین انتقال فشرده میکند؛ که روی اتصالات شبکه کندتر میتواند فرایند را سریعتر کند./path/to/local/dir/: دایرکتوری مبدأ. اسلش انتهایی (/) مهم است؛ چون به rsync میگوید محتوای دایرکتوری را کپی کند. بدون آن، خودِ دایرکتوری dir داخل مقصد کپی میشد.
این دستور دو دایرکتوری را بهشکل کارآمد همگام میکند. در اجراهای بعدی، الگوریتم انتقال دلتای rsync تضمین میکند فقط فایلهای جدید یا تغییرکرده ارسال شوند و زمان و پهنای باند ذخیره شود.
۲. چطور فایلها را از سرور ریموت با Rsync به ماشین محلیام کپی کنم؟
برای کپی فایلها از سرور ریموت، آرگومانهای مبدأ و مقصد را در دستور rsync معکوس کنید. مسیر ریموت مبدأ میشود و مسیر محلی مقصد.
ساختار دستور:
rsync -avz user@remote_host:/path/to/remote/dir/ /path/to/local/dir/
این دستور برای ساخت بکاپ از سرور یا بازیابی فایلهای بهروزشده پروژه مفید است. درست مثل انتقال محلی-به-ریموت، rsync فقط تفاوتهای بین مبدأ و مقصد را کپی میکند و برای دانلودهای مکرر، کارآمدتر از scp میسازدش.
۳. تفاوت scp و rsync چیست؟
تفاوت اصلی این است که scp هر بار کل فایل را کپی میکند، در حالی که rsync از الگوریتم انتقال دلتا برای کپی فقط بخشهای تغییرکرده فایلها استفاده میکند. این rsync را برای همگامسازی دایرکتوریها یا بهروزرسانی فایلهای بزرگ بهطور چشمگیری کارآمدتر میکند.
| ویژگی | scp (کپی امن) | rsync (همگامسازی ریموت) |
|---|---|---|
| روش انتقال | هر بار کل فایل را کپی میکند. | فقط بلوکها و بایتهای تغییرکرده را کپی میکند. |
| کارایی | برای انتقالهای یکباره بهترین است. | برای انتقالهای بعدی یا افزایشی فوقالعاده کارآمد. |
| مورد استفاده اصلی | کپی ساده و امن فایل. | همگامسازی دایرکتوری، بکاپهای افزایشی و میرور کردن. |
| انعطافپذیری | گزینههای پایه برای انتقال فایل. | گزینههای پیشرفته برای مستثنیکردن (--exclude)، حذف (--delete) و تست (--dry-run). |
در حالی که هر دو ابزار فایلها را بهشکل امن روی SSH منتقل میکنند، rsync برای وظایف همگامسازی مکرر انعطاف و کارایی بیشتری ارائه میدهد.
۴. چطور از Rsync با کلیدهای SSH استفاده کنم؟
rsync از SSH بهعنوان سازوکار انتقال پیشفرضش استفاده میکند؛ پس بهطور خودکار با احراز هویت کلید SSH موجودتان یکپارچه میشود. اگر کلید عمومیتان روی سرور ریموت authorize شده باشد، rsync بدون نیاز به رمز عبور وصل میشود.
در بیشتر موارد—جایی که کلید SSH در مکان پیشفرض ذخیره شده (مثلاً ~/.ssh/id_rsa)—دستور سرراست است:
rsync -avz /local/path user@remote_host:/remote/path
اگر لازم است فایل هویت غیراستانداردی را مشخص کنید، از گزینه -e برای پاس دادن دستور سفارشی به SSH استفاده کنید:
rsync -avz -e "ssh -i ~/.ssh/custom_key" /local/path user@remote_host:/remote/path
این قابلیت بهویژه برای خودکارسازی بکاپها با اسکریپتها یا Cron Jobها مفید است؛ چون به rsync اجازه میدهد بدون مداخله دستی اجرا شود.
۵. چطور فایلها یا دایرکتوریهای خاصی را از Rsync مستثنی کنم؟
برای جلوگیری از انتقال فایلها یا دایرکتوریهای خاص، از گزینه --exclude استفاده کنید. میتوانید الگوها را مشخص کنید و از گزینه چند بار استفاده کنید.
مثلاً برای همگامسازی یک پروژه نرمافزاری همراه با مستثنی کردن دایرکتوری node_modules و همه فایلهای لاگ:
rsync -avz --exclude 'node_modules' --exclude '*.log' /local/path/ user@remote_host:/remote/path/
برای مدیریت چندین الگوی مستثنیکردن، بهتر است آنها را در فایل جداگانهای فهرست کنید (مثلاً exclude.txt):
node_modules
*.log
.DS_Store
سپس با گزینه --exclude-from به این فایل ارجاع دهید:
rsync -avz --exclude-from='exclude.txt' /local/path/ user@remote_host:/remote/path/
این رویکرد دستوراتتان را تمیز نگه میدارد و قوانین مستثنیکردنتان را قابل نگهداری میسازد؛ که برای همگامسازی کدبیسها یا دیتاستهای پیچیده مفید است.
۶. گزینه –delete در Rsync چه کاری انجام میدهد؟
گزینه --delete به rsync دستور میدهد فایلها را از دایرکتوری مقصد حذف کند اگر در دایرکتوری مبدأ وجود نداشته باشند. این اقدام تضمین میکند مقصد میرور دقیقی از مبدأ شود.
هشدار: این گزینه فایلها را روی مقصد بهطور دائمی حذف میکند. توصیه میشود قبل از استفاده در محیط پروداکشن، یک اجرای آزمایشی انجام دهید.
این سناریو را در نظر بگیرید:
- مبدأ شامل: file_A.txt، file_B.txt
- مقصد شامل: file_A.txt، file_C.txt
دستور:
rsync -avz --delete /local/source/ user@remote_host:/remote/destination/
بعد از اجرا، مقصد طوری تغییر میکند که دقیقاً با مبدأ مطابقت کند: file_B.txt اضافه میشود و file_C.txt حذف میشود.
۷. چطور دستور rsync را بدون کپی واقعی فایلها تست کنم؟
برای پیشنمایش اقداماتی که یک دستور rsync بدون اعمال هیچ تغییری انجام خواهد داد، از گزینه --dry-run (یا نام مستعارش -n) استفاده کنید. یک Dry Run انتقال را شبیهسازی و گزارش میدهد کدام فایلها ساخته، بهروزرسانی یا حذف میشوند.
این روشی امن برای تأیید سینتکس، مسیرها و گزینههایتان قبل از اجرای دستور است. بهویژه هنگام استفاده از --delete اهمیت دارد.
نمونه دستور Dry Run:
rsync -avzn --delete /local/path/ user@remote_host:/remote/path/
خروجی همه تغییرات پیشنهادی را فهرست میکند. وقتی تأیید کردید اقدامات درستاند، میتوانید دستور را دوباره بدون فلگ -n برای انجام همگامسازی واقعی اجرا کنید.
نتیجهگیری
rsync یک ابزار چندکاره برای مدیریت فایلها است؛ هم محلی و هم روی شبکهها. این راهنما سینتکس بنیادیاش، نحوه انتقال امن فایلها روی SSH و استفاده از فلگهای مهمی مثل -a برای حفظ ویژگیهای فایل و --delete برای ساخت میرور دقیق یک دایرکتوری را پوشش داد. همچنین یاد گرفتید چطور دستورات را با --dry-run بهشکل امن تست کنید و وظایف همگامسازی را با cron خودکار کنید.
با این مهارتها میتوانید روندهای کاری انتقال فایل قابل اطمینان و کارآمد بسازید، عملیاتهای پیچیده بکاپ طراحی کنید و دادههایتان را با کنترل بیشتری مدیریت کنید.




