تصور کنید
در حال اجرای یک اسکریپت بکآپگیری حیاتی روی سرور از طریق SSH هستید، یا دارید یک پروژه سنگین را کامپایل میکنید. فرآیند به ۵۰٪ رسیده و همه چیز خوب پیش میرود. ناگهان... اینترنت قطع میشود، یا لپتاپ به خاطر اتمام باتری خاموش میشود!
با دلهره و استرس دوباره سرور را چک میکنید و میبینید اتصال قطع شده، فرآیند نصفهکاره رها شده و دیتابیس یا فایلهای پروژه هوا رفتهاند!
یا یک سناریوی روزمره دیگر: مشغول توسعه یک پروژه هستید. در یک تب ترمینال باید سرور محلی (مثلاً لاراول یا پایتون) را روشن نگه دارید، در تب دیگر مشغول نوشتن کد در Neovim هستید، و در یک تب دیگر میخواهید دستورات گیت یا داکر را اجرا کنید. مدام باید بین تبهای مختلف سیستمعامل جابهجا شوید، ترمینالها روی هم میافتند، تمرکزتان به هم میریزد و مدیریت این همه پنجره خودش به یک دغدغه اعصابخردکن تبدیل میشود.
اینجاست که با تمام وجود حس میکنید به چیزی فراتر از یک ترمینال ساده نیاز دارید؛ ابزاری که مثل یک دستیار همهفنحریف، محیط کار شما را نجات دهد.
tmux چیست؟
برای حل تمام این کابوسها و شلوغیها، ابزاری به نام tmux (مخفف Terminal Multiplexer یا چندتاییکننده ترمینال) خلق شده است.
به زبان ساده، tmux به شما اجازه میدهد که یک جلسه (Session) ترمینال را در پسزمینه سرور یا سیستم خود زنده نگه دارید، محیط ترمینال را به چندین بخش تقسیم کنید و همزمان چندین کار را بدون از دست دادن تمرکز پیش ببرید.
قابلیتهای کلیدی tmux
tmux فقط یک ابزار لوکال نیست؛ یک سبک زندگی در محیط متنی است! در ادامه کارهایی که این ابزار برای شما انجام میدهد را بررسی میکنیم:
جلسات فناناپذیر (Persistent Sessions)
بزرگترین جادوی tmux همین است. وقتی دستورات خود را داخل یک Session در tmux اجرا میکنید، این جلسه به صورت یک پروسه مستقل در لایه پشت سیستمعامل اجرا میشود.
- اگر اینترنت شما قطع شود یا پنجره ترمینال را ببندید، فرآیند شما روی سرور متوقف نمیشود.
- فردا یا حتی هفته بعد، دوباره از طریق SSH به سرور وصل میشوید، دستور اتکای مجدد (
tmux attach) را میزنید و دقیقاً به همان نقطهای برمیگردید که رها کرده بودید؛ با همان خروجیها و همان وضعیت!
تقسیمبندی صفحه (Panes & Windows)
دیگر نیازی به باز کردن ۱۰ تا تب در iTerm2 یا ترمینال پیشفرض ندارید. tmux به شما اجازه میدهد:
- پنجرهها (Windows): مثل تبهای مرورگر، پنجرههای کاملاً مجزا در یک Session بسازید (مثلاً یک پنجره برای ادیتور، یکی برای تست).
- قابها (Panes): یک صفحه ترمینال را به صورت افقی یا عمودی نصف کنید. میتوانید در سمت چپ کد بزنید و در سمت راست لاگهای سرور را زنده تماشا کنید.
جابهجایی سریع و مستقل از ماوس
tmux کاملاً با کیبورد مدیریت میشود. با استفاده از یک کلید پیشوند (Prefix) که به صورت پیشفرض Ctrl+b است، میتوانید بدون دست زدن به ماوس، بین پنلها جابهجا شوید، سایز آنها را تغییر دهید یا پنجره جدید بسازید. این یعنی سرعت و راندمان کاری شما به شدت بالا میرود.
اشتراکگذاری محیط ترمینال (Pair Programming)
دو نفر میتوانند به صورت همزمان به یک Session روی سرور متصل شوند. هر چیزی که نفر اول تایپ کند، نفر دوم به صورت زنده میبیند. این قابلیت برای رفع اشکال (Debugging) از راه دور یا آموزش فوقالعاده است.
خلاصهای از ساختار tmux
برای اینکه در ذهنتان ماندگار شود، ساختار tmux را به این شکل تصور کنید:
- Session (جلسه): کل محیط کاری شما برای یک پروژه. میتواند شامل چندین پنجره باشد.
- Window (پنجره): یک صفحه کامل ترمینال (مثل یک تب).
- Pane (قاب): بخشهای کوچکشده درون یک پنجره که کار را همزمان جلو میبرند.
بسیار خب، وارد فاز عملی میشویم! برای اینکه کار با tmux کاملاً ملکه ذهنتان شود، سناریو را در قالب یک مثال واقعی و یکپارچه جلو میبریم:
سناریو: فرض کنید میخواهید روی یک پروژه وبلاگ کار کنید. به یک محیط برای کدنویسی (با Neovim/Vim)، یک محیط برای روشن نگه داشتن سرور محلی، و یک محیط برای دستورات Git نیاز دارید.
قانون اول tmux: کلید پیشوند (Prefix)
قبل از اجرای هر دستوری درون tmux، باید به آن بفهمانید که دستور مربوط به خودش است، نه برنامهای که داخلش باز است. این کار با یک کلید ترکیبی به نام Prefix انجام میشود.
- پیشفرض این کلید
Ctrl + bاست (که در متن آن را به صورتPrefixمینویسیم). - یعنی اول
Ctrlوbرا همزمان فشار میدهید، دستتان را برمیدارید، و بعد کلید بعدی را میزنید.
گام اول: مدیریت جلسه (Session) – ساختن و ورود
جلسه یا Session، کل چتر حمایتی شماست. کل پروژه وبلاگ ما درون یک Session قرار میگیرد.
۱. ساخت یک Session نامگذاری شده
ترمینال معمولی خود را باز کنید و برای پروژهمان یک جلسه به نام blog_project میسازیم:
tmux new -s blog_project
(حالا شما وارد محیط tmux شدهاید و یک نوار وضعیت سبز رنگ در پایین صفحه میبینید).
۲. خروج امن از Session (بدون بستن برنامهها)
فرض کنید کارتان تمام شده و میخواهید لپتاپ را ببندید یا از سرور خارج شوید، اما اسکریپتها زنده بمانند.
- کلید میانبر: دکمههای
Prefixو سپس دکمهd(مخفف Detach) را بزنید. - شما به ترمینال اصلی خود برمیگردید، اما پروسه پروژه در پسزمینه زنده است.
۳. مشاهده جلسات فعال
برای اینکه ببینید چه جلساتی در پسزمینه در حال اجرا هستند:
tmux ls
(خروجی به شما نشان میدهد که جلسه blog_project هنوز زنده است).
۴. بازگشت و اتصال مجدد (Attach)
برای برگشتن به همان جلسهای که رها کرده بودید:
tmux attach -t blog_project
شما دقیقاً به همان نقطهای که دکمه Detach را زنده بودید برمیگردید.
گام دوم: مدیریت پنجرهها (Windows) – تبهای پروژه
حالا که داخل جلسه blog_project هستیم، نیاز به چند صفحه مجزا داریم. به طور پیشفرض یک پنجره باز است.
۱. ساخت پنجره جدید (مثلاً برای گیت)
- کلید میانبر: دکمههای
Prefixو سپسc(مخفف Create) را بزنید. - یک تب جدید در نوار پایین ظاهر میشود. برای اینکه بدانیم این تب مخصوص چیست، نامش را عوض میکنیم:
- تغییر نام پنجره: دکمههای
Prefixو سپس,(کاما) را بزنید. نام جدید را بنویسیدgitو Enter کنید.
۲. جابهجایی بین پنجرهها
حالا ما دو تا پنجره داریم (یکی اولی، یکی هم مال گیت). برای رفتوآمد بین آنها:
- پنجره بعدی:
Prefixو سپسn(Next) - پنجره قبلی:
Prefixو سپسp(Previous) - انتخاب با شماره:
Prefixو سپس شماره پنجره (مثلاً0یا1که در نوار پایین مشخص است). - منوی انتخاب پنجره:
Prefixو سپسwلیست تمام پنجرهها را ملموس نشان میدهد و با فلشها میتوانید انتخاب کنید.
گام سوم: مدیریت قابها (Panes) – تقسیمبندی یک صفحه
بیایید به پنجره اول (شماره ۰) برگردیم. میخواهیم در همین یک صفحه، هم کد بزنیم و هم سرور را مانیتور کنیم. اینجاست که صفحه را تکهتکه (Split) میکنیم.
۱. تقسیم صفحه به صورت عمودی (راست و چپ)
- کلید میانبر: دکمههای
Prefixو سپس%(علامت درصد) را بزنید. - صفحه به دو نیمه راست و چپ تقسیم میشود.
۲. تقسیم صفحه به صورت افقی (بالا و پایین)
روی پنل سمت راست بروید و این بار برای اینکه آن را به بالا و پایین تقسیم کنید:
- کلید میانبر: دکمههای
Prefixو سپس"(Double Quote) را بزنید. - حالا شما ۳ قاب (Pane) در یک صفحه دارید! در یکی Neovim باز است، در یکی سرور لوکال در حال اجراست و در دیگری لاگها را میبینید.
۳. جابهجایی بین قابها (حرکت درون صفحه)
برای اینکه فوکوس کیبورد را بین این تکهها بچرخانید:
- کلید میانبر عمومی:
Prefixو سپس دکمهo(شما را بین پنلها میچرخاند). - حرکت دقیق با فلشها:
Prefixو سپس یکی از فلشهای کیبورد (جهتها) به هر سمتی که میخواهید بروید.
۴. تغییر سایز قابها (Resize)
اگر فضای یکی از قابها کم است و میخواهید بزرگتر شود:
- دکمههای
Prefixرا بزنید، سپس دست خود را رویCtrlنگه دارید و همزمان کلیدهای جهتنما (فلشها) را چند بار فشار دهید تا مرز پنل جابهجا شود.
۵. تمامصفحه کردن یک قاب (Zoom)
گاهی میخواهید موقتاً کدهای درون یک قاب کوچک را به صورت تمامصفحه ببینید و بعد دوباره به حالت ۳ پورت برگردید:
- کلید میانبر:
Prefixو سپس دکمهz(Zoom). پنل تمامصفحه میشود. برای برگشتن به حالت قبل، دوباره همین را بزنید.
۶. بستن یک قاب
کار پروژهتان تمام شده و میخواهید یک قاب را ببندید:
- دستور
exitرا در آن تایپ کنید یا کلیدهایPrefixو سپسxرا بزنید و تایید (y) کنید.
جدول تقلب سریع (Cheat Sheet) برای مرور ذهنی
برای اینکه همیشه دم دستتان باشد، کل سناریوی بالا را در این جدول خلاصه کنیم:
| بخش | هدف دستور | کلید میانبر (بعد از Prefix) | دستور متنی (در ترمینال اصلی) |
|---|---|---|---|
| Session | ساخت جلسه جدید با نام | - | tmux new -s <name> |
| خروج امن (Detach) | d |
- | |
| لیست کردن جلسات | - | tmux ls |
|
| اتصال مجدد (Attach) | - | tmux attach -t <name> |
|
| Window | ساخت تب جدید | c |
- |
| تغییر نام تب | , |
- | |
| حرکت به تب بعدی / قبلی | n / p |
- | |
| لیست تصویری تبها | w |
- | |
| Pane | تقسیم عمودی (راست/چپ) | % |
- |
| تقسیم افقی (بالا/پایین) | " |
- | |
| جابهجایی بین قابها | کلیدهای جهتنما یا o |
- | |
| بزرگنمایی موقت (Zoom) | z |
- | |
| تغییر سایز مرزها | نگه داشتن Ctrl + جهتها |
- | |
| بستن قاب فعلی | x (یا نوشتن exit) |
- |
با تمرین همین سناریوی ساده روی سیستم خودتان، تا چند روز دیگر دستتان به شدت روان خواهد شد و مدیریت ترمینال برایتان مثل آب خوردن میشود!