7 روش کاربردی برای اجرای دستورات لینوکس در پس زمینه
هر کاربر لینوکسی از ارزش دستورات مهم لینوکس باخبر است. وقتی از طریق خرید سرور مجازی لینوکس (Linux VPS Hosting) برای اولین بار وارد دنیای وسیع لینوکسیها شدید و با دستورات لینوکس در ترمینال کار کردید به ارزش نامشهود هسته لینوکس پی میبرید.
با اجرای دستورات لینوکس در پس زمینه سرعت سیستم بالا میرود و شما میتوانید چندین دستور را همزمان اجرا کنید بدون اینکه اختلالی در عملکرد سیستم ایجاد شود. روشهای مختلفی برای اجرای دستورات در پس زمینه لینوکس وجود دارد که از ساده ترین روشها اضافه کردن & به پایان دستور است. میتوانید نحوه استفاده از این دستور و سایر روشها را در متن مقاله مشاهده بکنید.
اما ممکن است با یک مشکل مواجه شوید. این که اجرا شدن یک کامند زیاد طول میکشد و باید منتظر بمانید تا بتوانید کامند دیگری اجرا کنید. طول کشیدن اجرای یک کامند باعث میشود تا shell جدیدی را اجرا کنید یا مدت زیادی را به انتظار بنشینید.
پس چاره چیست؟ میتوان کامندها را در پس زمینه لینوکس اجرا کرد. مانند هر کامند دیگری، این کار هم از طریق ترمینال امکانپذیر است. خوشبختانه میتوان با چند ترفند ساده دستورات لینوکس را در پس زمینه یا بک گراند اجرا کرد.
7 روش کاربردی برای اجرای دستورات لینوکس در پس زمینه
استفاده از ترمینال در لینوکس بصورتی است که یک کامند بصورت ممتد در حال اجراست و معمولا قبل از اتمام پروسه اجرا یا خارج شدن از ترمینال نمیتوان دستور دیگری را بصورت همزمان اجرا کرد.
مانند هر محدودیت دیگری راهحلهایی برای این مسئله در نظر گرفته شدهاست که امکان اجرای چند فرآیند همزمان را به هر کاربر لینوکس میدهد.
در این قسمت میخواهیم راههای اجرای دستورات مهم لینوکس در پس زمینه را بررسی کنیم. دستورات زیر از پرکاربردترین دستورات لینوکس هستند. 7 راه اجرای برنامه در پس زمینه لینوکس شامل موارد زیرند:
1. اضافه کردن & یا Ampersand به پایان دستور
آسان ترین شیوه برای اجرای دستورات در پس زمینه لینوکس اضافه کردن کاراکتر Ampersand یا همان & به پایان دستور است. مثلا اگر firefox را در ترمینال باز کنید، تا زمانی که از فایرفاکس خارج نشدهاید نمیتوانید از shell استفاده کنید.
اما اگر یک & به آخر دستور خود اضافه کنید دستور به bash میگوید که کامند را در پس زمینه لینوکس اجرا کند و میتوانید از ترمینال استفاده کنید.
firefox &
همانطور که مشاهده میکنید خط جدیدی در ترمینال ایجاد شده است بدین معنی که عملکرد firefox از ترمینال جدا شده و بصورت مستقل درحال اجراست.
2. استفاده از bg برای اجرای برنامه در پس زمینه لینوکس
بعضی اوقات پس از اجرای یک کامند لینوکس پی میبریم که برای تکمیلش زمان زیادی لازم است. در لینوکس این نوع کامندها را میتوانیم به سادگی به پس زمینه بفرستیم.
برای فرستادن دستورات در حال اجرا به پس زمینه لینوکس کافیست دکمههای Ctrl + Z را باهم فشار دهیم و سپس از دستور bg استفاده کنیم. فشار دادن دکمههای Ctrl + Z دستور در حال اجرا را متوقف میکند و دستور bg آن را به پس زمینه میفرستد.
- برای مشاهده لیست فرایندهای در حال اجرا در پس زمینه لینوکس میتوانید از دستور jobs استفاده کنید.
- از کامند fg برای انتقال دستور از پس زمینه به foreground لینوکس میتوانید کمک بگیرید.
- اگر چندین دستور در پس زمینه در حال اجراست میتوانید n% را پس از دستور fg بکار ببرید. کاراکتر n در این کامند لینوکس مشخصه یا ID دستور مدنظرتان است. مثلا برای آوردن دستور 2 به پیش زمینه لینوکس کامند مورد نیاز بصورت زیر است:
fg %2
- برای kill کردن دستوری، بطور مشابه از دستور % بهمراه ID دستور، بعد از دستور kill استفاده کنید:
kill %2
3. فرستادن دستورات لینوکس به پس زمینه از طریق nohup
سومین روش برای اجرای دستورات لینوکس در پس زمینه، یعنی کامند nohup به کاربران اجازه run کردن دستوراتی که از سیگنالهای HUP یا Hang Up مصون هستند را میدهد.
کامند لینوکسی nohup نیز از آسانترین روشها برای اجرای برنامه لینوکس در پس زمینه است. کامند لینوکس زیر یک پورت اسکن Nmap را در پس زمینه اجرا میکند:
nohup sudo nmap -sS --top-ports=15 192.168.1.1/24
یکی از بهترین مزیتهای nohup این است که کامندهایتان حتی پس از خروج از شل shell اجرا خواهند شد. علاوه بر این، این دستور لاگ فایلی از اجرای دستورات را ایجاد و در فایل nohup.out در دایرکتوری فعلیتان یا داخل HOME$ قرار خواهد داد.
4. استفاده از System Redirects برای run کردن کامند در پس زمینه لینوکس
در محیط لینوکس میتوانیم از System Redirects نیز برای اجرای برنامه در پس زمینه لینوکس استفاده کنیم. به عنوان مثال بعد از اجرای دستور ping زیر، shell آن را در پس زمینه لینوکس اجرا خواهد کرد و کنترل ترمینال را مجددا به ما خواهد سپرد:
ping -c5 8.8.8.8 > output.log 2>&1 &
در توضیح این دستور گفتنی است که کامند، خروجی را به فایل output.log ریدایرکت خواهد کرد. اگر نیازی به فایل خروجی ندارید میتوانید output.log را با dev/null/ جایگزین کنید.
عبارت 1&<2 به bash میگوید که هر اروری را به همان فایل redirect کند. کاراکتر & در آخر کامند نیز به بش میگوید که این کامند را در پس زمینه اجرا کند.
5. اجرای دستورات لینوکس در پس زمینه با بکارگیری disown
disown فرستادن کامند لینوکس به پس زمینه را بصورت بسیار آسان اجرایی میکند. ابتدا کاراکتر & را برای فرستادن کامند به پس زمینه بکار میبریم و سپس با نوشتن disown در کامند، آن را از شل shell جدا detach میکنیم.
gedit & disown
یکی از مزیتهای disown همانند nohup این است که سیستم تسک ورودی را پس از log out یا بستن شل، kill نخواهد کرد.
6. استفاده ازکامندهای screen و tmux برای ران کردن کامندها در background لینوکس
tmux یک تسهیمکننده قدرتمند است که امکان run کردن چندین نشست ترمینال را در یک پنجره به کاربر میدهد.
tmux new -d 'ping -c 10 8.8.8.8 > output.log'
هنگامی که کامند tmux بالا را اجرا میکنید، کامند پینگ را در یک شل مجزا اجرا میکند و آن را در حالت اجرا در پس زمینه نگه میدارد. با این روش میتوانید هر پروسه یا کامند لینوکس را در پس زمینه اجرا کنید.
دستور screen در لینوکس نیز کارکردی همانند tmux دارد. برای استارت یک session با screen به طریق زیر میتوانیم عمل کنیم:
$ screen -S <session_name>
در این دستور به جای <session_name> نام session خود را جایگزین کنید. حالا برای جداکردن این فرایند از پنجره ترمینال دکمههای Ctrl + a را گرفته و سپس D را فشار دهید. اکنون پروسه در پسزمینه اجرا خواهد شد.
برای برگرداندن یک کامند از بک گراند به foreground که با کامند screen به پس زمینه لینوکس فرستاده شده بود کامند زیر را اجرا کنید:
screen -r session_name
7. بکار بردن کامند systemd برای اجرای دستورات لینوکس در background
در توزیعهای مدرن لینوکس که از systemd بعنوان init system استفاده میکنند میتوانید از systemd برای انتقال کامندها به پس زمینه استفاده کرده و آنها را بعنوان سیستم_سرویس system service مدیریت کنید.
این روش برای اجرای دستورات لینوکس در پس زمینه کنترل و انعطاف بیشتری در مدیریت پروسه اجرای تسکهای زمانبر برای کاربر به ارمغان میآورد. استفاده از کامند systemd به شرح زیر است:
۱) ایجاد service unit:
با استفاده از اکستنشن service. یک فایل service unit ایجاد میکنیم. این فایل ویژگی و رفتار پروسه پس زمینه را معین میکند. به عنوان نمونه فایلی به نام myprocess.service ایجاد میکنیم:
sudo nano /etc/systemd/system/myprocess.service
۲) اضافه کردن کانفیگهای مورد نیاز:
به فایل service unit کانفیگهای مورد نیازمان را اضافه میکنیم. بعنوان مثال:
[Unit]
Description=My Background Process
After=network.target
[Service]
ExecStart=/path/to/myprocess
Type=simple
Restart=always
[Install]
WantedBy=default.target
در مثال بالا لازم است که به جای path/to/myprocess/ کامند یا اسکریپتی که قصد اجرای آن در پس زمینه را داریم بنویسیم.
۳) ذخیره فایل:
فایل را ذخیره میکنیم و از تکست ادیتور خارج میشویم.
۴) ریلود systemd:
systemd را ریلود میکنیم تا فایل service unit جدید را بخواند:
sudo systemctl daemon-reload
۵) ران کردن کامند در پس زمینه با systemd:
با بکاربردن systemd کامندمان را در پس زمینه اجرا میکنیم:
sudo systemctl start myprocess
حالا کامندمان استارت خورده و بصورت مستقل بعنوان یک سیستم_سرویس system service در background لینوکس اجرا خواهد شد.
سخن آخر
برخورداری از قابلیت اجرای دستور در پس زمینه لینوکس مدیریت سیستم را برای کاربران ثمربخش میسازد. میتوانید از راههای متنوعی تسکها و کامندها را برای اجرا به پس زمینه لینوکس بفرستید.
بکارگیری فیچرهای bash مانند & و دکمههای Ctrl + Z سهل و آسان است اما در مقابل، سیستم تسکها را هنگام بستن یا خروج از shell خواهد بست یا به اصطلاح متوقف خواهد کرد.
از سوی دیگر اما ابزارهایی مانند nohup و disown کامندتان را پس از خروج از شل یا لاگ اوت شدن در حالت اجرا نگه خواهند داشت. پس بنابر نیاز خود یکی از این 7 روش را برای اجرای دستورات لینوکس در پس زمینه انتخاب کنید.
دقت داشته باشید که کامندها را به مدت طولانی در پس زمینه لینوکس نگه ندارید چون که احتمال تبدیل آنها به zombie process وجود دارد. zombie process ها باعث کند شدن سیستم میشوند.
به همین جهت هرازگاهی کامندهای در حال اجرا در پس زمینه لینوکس را چک و کامندهایی که به زامبی تبدیل شدهاند را kill کنید.