همه ما می‌دانیم که اجرای فرآیندها یا دستورات، هنگام قطع نشست SSH ریموت خاتمه می‌یابد. اما، آیا راهی برای ادامه اجرای فرآیند، پس از خاتمه نشست ssh وجود دارد؟

بله وجود دارد و ما در این مقاله می‌خواهیم راه‌های مختلف آن را شرح دهیم.

اولین سوال که در این زمینه به ذهن می‌آید، این است که در چه شرایطی ممکن است بخواهیم اجرای یک فرآیند را ادامه دهیم؟

در بسیاری از موارد، اجرای یک فرآیند زمان بر است و در صورت قطع آن اجرا، مجبور خواهید بود که فرآیند را دوباره از ابتدا شروع کنید. این فرایند وقت گیر است و وقت شما را نیز هدر می‌دهد.

 

یک سناریوی دیگر این است که شما هنگام انجام برخی از کارهای مهم روی سرور ریموت در وضعیت اضطراری قرار گرفته و مجبور می‌شوید نشست SSH ریموت را قطع کنید، اما در عین حال می‌خواهید اجرای فرآیند را بر روی دستگاه ادامه دهید. چگونه چنین کاری را انجام خواهید داد؟

در این مواقع همچنین می‌توانید، فرایندهای با اجرای طولانی را به پس زمینه منتقل کنید تا از تداخل با فعالیت فعلی که در حال انجام آن هستید جلوگیری نمایید. بعداً می‌توانید نشست را هر زمان که بخواهید مجدداً وصل کنید.

 

این مطلب نیز ممکن است برای شما مفید باشد: افزودن صفحه خوش‌آمدگویی به SSH

 

این کار با استفاده از دستورات زیر انجام می‌شود.

  • screen
  • tmux
  • nohup
  • disown
  • byobu

 

روش 1 - استفاده از دستور screen

Screen یک مدیر پنجره تمام صفحه است که یک ترمینال فیزیکی را بین چندین فرآیند (به طور معمول پوسته‌های تعاملی) تقسیم می‌کند. هر ترمینال مجازی، عملکرد ترمینال DEC VT100 را ارائه می‌دهد.

این ابزار، توابع و کلیدهای مفید بسیاری را برای کنترل صفحه نمایش به صورت محلی فراهم می‌کند. Screen این امکان را به کاربر می‌دهد که یک فرایند طولانی در حال اجرا را از یک نشست جدا کرده و سپس هر زمان که بخواهد دوباره آن را وصل نماید.

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه راه اندازی تونل SSH (فوروارد کردن پورت)

 

نحوه نصب دستور screen

دستور screen به طور پیش فرض در اکثر سیستم‌های لینوکس از پیش نصب شده است. با این حال اگر برای سیستم شما چنین نبود، مراحل نصب زیر را دنبال کنید.

در Debian / Ubuntu، از  دستور  APT-GET یا دستور APT برای نصب screen استفاده کنید.

$ sudo apt install screen

در RHEL / CentOS از دستور YUM برای نصب screen استفاده کنید.

$ sudo yum install screen

در Fedora، از دستور DNF برای نصب screen استفاده کنید.

$ sudo dnf install screen

در Arch Linux، از دستور Pacman  برای نصب screen استفاده کنید.

$ sudo pacman -S screen

در openSUSE، از دستور Zypper برای نصب screenاستفاده کنید.

$ sudo zypper in screen

 

نحوه جدا کردن و وصل مجدد نشست‌ها

نشست screen را قبل از راه اندازی اجرای یک فرآیند طولانی آغاز نمایید.

$ screen

اکنون، یک فرایند طولانی را اجرا کنید. در اینجا ما قصد داریم سرور پشتیبان را به منظور پروسه بازیابی فاجعه (DR)T به سرور ریموت دیگر منتقل کنیم.

$ rsync -avzhe ssh /backup root@192.168.0.161:/backups/week-1/

این انتقال حدود 300 گیگابایت است، حداقل 24 ساعت طول می‌کشد و شما نمی‌خواهید نگران قطع شدن اجرای فرآیند باشید. تنها با زدن Ctrl+A و به دنبال آن d، شما خروجی مشابه زیر را دریافت خواهید کرد.

[detached from 4941.pts-0.server]

اکنون می‌توانید با خیال راحت نشست را جدا کرده و از سرور ریموت خارج شوید.

بعداً هر زمان که بخواهید مقدار پیشرفت انتقال را ببینید، کافیست وارد سیستم ریموت شده و برای اتصال نشست، دستور زیر را وارد کنید.

$ screen -r

اگر بیش از یک نشست screen دارید، دستور زیر را برای یافتن شناسه نشست اجرا کنید. هنگامی‌که شناسه نشست را بدست آوردید، به همان صورت آن را وصل نمایید.

$ screen -ls
There is a screen on:
	4941.pts-0.server	(Tuesday 21 November 2017 06:58:14  IST)	(Detached)
1 Socket in /run/screen/S-magi.

 

روش 2 - استفاده از دستور tmux

tmux مخفف terminal multiplexer است و این امکان را به کاربران می‌دهد که چندین ترمینال (عمودی و افقی) را در یک پنجره واحد ایجاد و فعال کنند. این، می‌تواند به راحتی در یک پنجره هنگام کار با مسائل مختلف قابل دسترسی و کنترل باشد.

این دستور از یک مدل سرور-کلاینت استفاده کرده و امکان به اشتراک گذاری نشست‌ها را بین کاربران فراهم می‌نماید. علاوه‌براین با استفاده از آن می‌توان چندین ترمینال را دوباره به یک نشست tmux متصل نمود.

شاید در نگاه اول این دستور مشابه دستور screen باشد؛ ولیکن در واقع دستور tmux طیف وسیع تری از گزینه‌های پیکربندی را ارائه می‌دهد.

توجه داشته باشید که Ctrl+b پیشوند پیش فرض در اجرای دستور tmux است، بنابراین، برای انجام هرگونه عمل در tumx، باید ابتدا پیشوند و سپس گزینه‌های مورد نیاز را تایپ نمود.

 

این مطلب نیز ممکن است برای شما مفید باشد: بررسی ورودهای قبلی از طریق SSH به سرور

 

نحوه نصب دستور tmux

دستور tmux به طور پیش فرض در اکثر سیستم‌های لینوکس وجود دارد. اگر در سیستم شما چنین نبود، مراحل نصب را به صورت زیر دنبال کنید.

در Debian / Ubuntu، از دستور APT-GET یا دستور APT برای نصب tmux استفاده کنید.

$ sudo apt install tmux

در RHEL / CentOS، از دستور YUM برای نصب tmux استفاده کنید.

$ sudo yum install tmux

در Fedora، از دستور DNF برای نصب tmux استفاده کنید.

$ sudo dnf install tmux

در Arch Linux، از دستور Pacman برای نصب tmux استفاده کنید.

$ sudo pacman -S tmux

در openSUSE، از دستور Zypper برای نصب tmux استفاده کنید.

$ sudo zypper in tmux

 

نحوه قطع و مجددا وصل نمودن نشست

قبل از راه اندازی اجرای یک فرآیند طولانی، نشست tmux را آغاز کنید.

$ tmux

اکنون یک فرایند طولانی اجرا کرده و Ctrl+b را به همراه d کلیک نمایید تا با توقف اجرای فرآیند، به صورت ایمن نشست tmux شما قطع شود.

$ rsync -avzhe ssh /backup root@192.168.0.161:/backups/week-2/

پس از قطع نشست tmux، یک خروجی مشابه زیر به شما نمایش داده می‌شود.

[detached (from session 0)]

پس از ورود به سرور ریموت، دستور زیر را اجرا کنید تا نشست‌های tmux موجود برای شما لیست شود.

$ tmux ls
0: 1 windows (created Tue Nov 21 07:02:33 2017) [204x53]

اکنون، با استفاده از شناسه نشست، به صورت زیر نشست tmux را مجدداً وصل کنید.

$ tmux attach -t 0

 

روش 3 - استفاده از دستور byobu

byobu اسکریپتی است که یک مدیر پنجره مبتنی بر متن یا صفحه یا tmux را راه اندازی می‌کند. این دستور، امکان اجرای چندین نشست را در تب‌های مختلف یک پنجره فراهم می‌نماید. علاوه‌براین با استفاده از آن می‌توان نشست‌های SSH را قطع کرده و مجدداً وصل نماییم؛ در حالی که برنامه‌های شما در پس زمینه همچنان در حال اجرا هستند.

ویژگی قابل توجه این دستور، وجود نوار وضعیت است که دو خط را در پایین صفحه نمایش شما نشان می‌دهد. خط بالا خط Caption و خط پایین خط Hard Status است.

خط Caption: این خط نام پنجره، نام کاربری، نام میزبان، آدرس IP و فهرست را نشان می‌دهد.

خط Hard Status line: این خط، خروجی رنگی را نشان می‌دهد که شامل نام و نسخه توزیع، آمار و اطلاعات مربوط به سیستم محلی است. هر مورد از اعلان وضعیت بطور مستقل قابل تنظیم است و می‌تواند توسط ابزار پیکربندی روشن یا خاموش شود.

 

این مطلب نیز ممکن است برای شما مفید باشد: ایجاد میانبر برای اتصال به سرورها در SSH در اوبونتو

 

نحوه نصب دستور byobu

Byobu در اکثر توزیع‌ها به صورت پیش فرض در دسترس نیست. برای نصب آن مراحل زیر را دنبال کنید.

در Debian / Ubuntu، از دستور APT-GET یا دستور APT برای نصب byobu استفاده نمایید.

$ sudo apt install byobu

در سیستم‌های RHEL / CentOS، مخزن EPEL را فعال کرده و سپس از دستور YUM برای نصب byobu استفاده نمایید.

$ sudo yum install byobu

در Fedora، از دستور DNF برای نصب byobu استفاده کنید.

$ sudo dnf install byobu

در سیستم‌های Arch Linux، از دستور yaourt یا دستور Packer برای نصب byobu استفاده کنید؛ زیرا این ابزار در مخازن AUR موجود است.

$ yaourt -S byobu
or
$ packer -S byobu

در openSUSE، از دستور Zypper برای نصب byobu استفاده کنید.

در نسخه openSUSE_Leap_42.3 به صورت زیر:

$ sudo zypper addrepo https://download.opensuse.org/repositories/utilities/openSUSE_Leap_42.3/utilities.repo
$ sudo zypper refresh
$ sudo zypper install byobu

و در نسخه openSUSE_Leap_42.2 به صورت زیر:

$ sudo zypper addrepo https://download.opensuse.org/repositories/utilities/openSUSE_Leap_42.2/utilities.repo
$ sudo zypper refresh
$ sudo zypper install byobu

 

نحوه استفاده از این ویژگی

قبل از راه اندازی اجرای یک فرآیند، با اجرای دستور زیر نشست byobu را آغاز کنید.

$ byobu

با استفاده از دستور زیر می‌توان اجرای فرآیند طولانی را راه اندازی کرده و از سرور ریموت خارج شد.

$ ping 2daygeek.com &

سپس F6 (قطع) را کلیک کنید تا byobu قطع شده و اجرای فرآیند شما همچنان در پس زمینه ادامه یابد.

[detached (from session 1)]

پس از ورود به سیستم ریموت، کافی است byobu را تایپ کنید تا نشست شما مجدداً وصل شود.

$ byobu

 

روش 4 - استفاده از دستور nohup

Nohup مخفف No Hang UP است و برای ما این امکان را فراهم می‌کند تا بعد از قطع نشست ssh اجرای فرآیندتان ادامه یابد. این ابزار در تمام توزیع‌های لینوکس وجود دارد؛ چراکه بخشی از هسته‌های GNU است.

ساختار رایج دستور nohup به صورت زیر می‌باشد:

nohup Command [Arg] &

ابتدا اجرای یک فرآیند طولانی را راه اندازی کرده و سپس از سرور ریموت خارج شوید.

$ nohup ping 2daygeek.com &
[1] 10733
nohup: ignoring input and appending output to 'nohup.out'

برای مشاهده فعالیت‌های پس زمینه، وارد سرور ریموت شده و دستور زیر را اجرا نمایید.

$ jobs -l
[1]+ 10733 Running                 nohup ping 2daygeek.com &

 

روش 5 - استفاده از دستور disown

Disown که ویژگی bash shell است، یکی دیگر از ابزارها است. در واقع این ابزار، یک دستور داخلی ساخته شده در shell مانند cd، pwd و غیره است. همین امر از طریق دستور type disown قابل اجرا است.

تمام دستورات فوق که در مورد آن‌ها بحث کردیم، تنها قبل از اجرای فرایندها کاربردی هستند. درحالی که برای دستور disown چنین نیست.

دستور disown با جدول فعالیت‌ها کار می‌کند، بنابراین کافی است شناسه فعالیت را بدست آورده و سپس از دستور disown برای ادامه اجرای فرآیند پس از قطع نشست خود استفاده نمایید.

به عنوان مثال می‌خواهیم فعالیت زیر را در پس زمینه اجرا کنیم.

$ ping magesh.co.in > /dev/null &
[1] 13310

دستور زیر را برای لیست کردن فعالیت‌های پس زمینه از جدول فعالیت‌ها اجرا کنید.

$ jobs -l
[1]+ 13310 Running                 ping magesh.co.in > /dev/null &

دستور disown را به همراه شناسه فعالیت اجرا کنید تا از قطع شدن آن هنگام خارج شدن از نشست جلوگیری نمایید.

$ disown -h %1

با اجرای دستور زیر می‌توانید، فرایند اجرا را پس از ورود به نشست ریموت مجدداً بررسی نمایید.

$ ps -aux | grep ping
magi     13310  0.0  0.1  31696  2376 ?        S    07:24   0:00 ping magesh.co.in
magi     13960  0.0  0.0  14240  1084 pts/3    S+   07:36   0:00 grep --color=auto ping

 

 

منبع:

2daygeek