اترك عملك في Tmux وعُد إليه لاحقًا
إذا كنتم تشغّلون أوامر على جهاز بعيد، فعليكم حتمًا تشغيلها في جلسة قابلة للفصل حتى لا تتوقف إذا انقطع الاتصال. اخترنا tmux، وإليكم السبب!

ما هو Tmux؟
Tmux هو terminal multiplexer، ومن هنا جاء اسمه. يتيح لكم إنشاء عدة طرفيات (terminals) داخل نافذة واحدة. ويمكن أيضًا تشغيله في الخلفية، فتنفصلون عن الجلسة وتعودون إليها لاحقًا.
أليست هناك بدائل أخرى؟
قبل Tmux كنا نستخدم screen عادةً، وهو أيضًا قابل للفصل، وعمره الآن 33 عامًا. لكن screen لم يعد يحظى بتطوير نشط، ولم يُصمَّم أصلًا مع وضع UNIX في الاعتبار. ويمكن القول إنه أصعب في الاستخدام، وله بعض العيوب المذكورة في wiki الخاص بـ Tmux. أما Tmux فواسع الانتشار ويحظى بتطوير نشط، وستجدون كثيرًا من الأدلة التي تشرح إعداده واستخدامه. كما أن العمل به ممتع، فشريط الحالة مفيد، ومعظم أوامر الطرفية تعمل مباشرة داخل tmux.
لماذا قد تحتاجون إلى terminal multiplexer؟
هناك أسباب عديدة لاستخدام terminal multiplexer، أما أنا فأستخدم tmux لغرضين رئيسيين:
- تشغيل المهام على الخوادم البعيدة عبر SSH
- تشغيل عدة خدمات أثناء التطوير
وحتى لمجرد التجوّل على الخوادم البعيدة، فإن tmux مفيد. إذ يتيح لكم فتح اتصال واحد وإدارة عدة مهام، والتنقل بينها بسهولة، والمقارنة بينها، والاحتفاظ بالسجلات في كل pane.
تشغيل المهام على الخوادم البعيدة
إذا احتجتم إلى تشغيل مهام على خوادم بعيدة، فاحرصوا دائمًا على تشغيلها في جلسة قابلة للفصل. فإن لم تتمكنوا من فصل الجلسة، فأنتم معرّضون لأن يقضي انقطاع الاتصال على مهمتكم. وإن لم تكن المهمة idempotent، فقد تُفسدون البيانات بطريقة لا يمكن إصلاحها. تعلّمت هذا الدرس بالطريقة الصعبة، ولحسن الحظ لم يكن ذلك في بيئة الإنتاج، لكنه سبّب صداعًا هائلًا حين حاولت معرفة كمية البيانات التي عولجت بالفعل. يتيح لنا Tmux تشغيل جلسة داخل الطرفية، ثم تشغيل السكربت داخلها. ويمكنكم أيضًا تقسيم الجلسة إلى عدة أجزاء وتشغيل عدة سكربتات. وبعدها يمكنكم الانفصال بأمان، وتسجيل الخروج، والذهاب إلى المنزل لتناول العشاء، ثم تسجيل الدخول ومتابعة العمل. غالبًا ما يصل عدة مستخدمين إلى الخوادم البعيدة، لذا أنصح بتسمية جلسة tmux الخاصة بكم حتى يعرف المطوّرون الآخرون بسهولة أنها لكم. وأنصح أيضًا بتسمية النوافذ إذا كنتم تشغّلون مهمة مختلفة في كل منها، أو حتى إعطائها معرّفات إذا كنتم تشغّلون المهمة نفسها، لتعرفوا أي مهمة تعالج أي جزء من البيانات.
تشغيل عدة خدمات أثناء التطوير
مع tmuxinator يمكنكم تشغيل عدة خدمات بسهولة في جلسة واحدة، وبذلك تُشغّلون بيئة التطوير بأكملها بأمر واحد. لإنشاء ملف إعدادات، شغّلوا
tmuxinator edit project_name
سيظهر لكم ملف إعدادات معبّأ مسبقًا. ستحتاجون إلى تحديث مسار root ليشير إلى مسار المشروع، ثم يمكننا إعداد نوافذ tmux التي ستُنشأ. تتضمن بيئة تطوير rails المعتادة لديّ: rails server وrails console وelasticsearch وsidekiq وguard للـ specs وwebpack-dev-server، ونافذة لعمل commit للتغييرات. وستبدو إعدادات النوافذ لديّ تقريبًا كالتالي
windows:
- server:
- rails server
- sidekiq: sidekiq
- webpack: webpack-dev-server
- guard: GUARD_ALL_ON_START=true guard start --no-interactions
- console: rails console
- elasticsearch: elasticsearch
- git: git status
والآن لتشغيل المشروع يكفي أن أستدعي
tmuxinator start project_name
ومع iTerm2 يمكنكم أيضًا دمج tmux بشكل أنيق، وجعل كل نافذة tmux تبدو وتعمل كنافذة iTerm عادية. لقد أعددت iTerm2 لديّ ليفتح tabs، ويُخفي عميل tmux، ويعرض محتوى شريط حالة tmux. وبهذا أشغّل بيئة التطوير كأنني فتحت tabs للتو وشغّلت الأوامر يدويًا. ويمكنني أيضًا إنهاء جلسة tmux فتُغلق جميع النوافذ، وأعود إلى النافذة الأصلية التي كنت فيها قبل تشغيل tmuxinator.
هل تريدون معرفة المزيد؟
أنصحكم بحفظ بعض الأوراق المرجعية المختصرة (cheat sheets). قد يبدو Tmux غريبًا بعض الشيء في البداية، لكن مع هذه الأوراق يصبح التعامل معه سهلًا. وإن أردتم التعمق أكثر، فإن tmux يوفّر توثيقًا ممتازًا و أسئلة شائعة في wiki الخاص به. ويتناول دليل Getting Started قدرًا كبيرًا من المعلومات التي ستمنحكم فهمًا جيدًا للأساسيات.


