در این پست ابتدا مفهوم مهمی درباره مدیریت process ها در سیستم عامل لینوکس را مورد بررسی قرار میدهیم. اینکه چگونه یک پروسس از ترمینال کنترل کننده آن کاملا جدا شود. زمانی که یک Process در یک ترمینال درگیر شود دو مشکل ممکن است روی دهد :
برای روبه رو با این دو مشکل شما نیاز دارید که به طور کامل یک process را از یک ترمینال جدا کنید. قبل از اینکه برای حل مشکل اقدامی انجام دهیم اجازه دهید به طور کلی نحوه اجرا کردن process ها در بک گراند را مورد بحث قرار دهیم.
نحوه شروع کردن یک Process لینوکس یا کامند در Background
اگر یک process از قبل در حال اجرا باشد همانند نمونه زیر از دستور tar شما به آسانی و با استفاده از Ctrl+z میتوانید آنرا stop کنید و سپس با دستور bg به ادامه اجرای دستور در بک گراند و به عنوان یک job اقدام کنید.
توصیه میشود که مطالعه کنید : آموزش دستور tar در لینوکس برای فشرده سازی و آرشیو فایل ها به همراه 18 مثال عملی
شما میتوانید تمام job های موجود در background را با تایپ کردن دستور jobs مشاهده کنید. به هر حال stdin, stdout, stderr مربوط به دستور همچنان به ترمینال متصل هستند.
مثال :
شما میتوانید همچنین یک process را مستقیما از بک گراند و با استفاده از علامت ampersand "&" اجرا کنید.
مثال :
به مثال زیر توجه کنید اگر چه دستور tar به عنوان یک background job شروع شده بود یک پیغام خطا همچنان به ترمینال ارسال شد به این معنی که process هنوز هم به ترمینال کنترل کننده دستور متصل است.
در حال اجرا نگه داشتن Process های لینوکسی بعد از خارج شدن از ترمینال
ما از دستور disown استفاده خواهیم کرد. این دستور بعد از اینکه یک pocess اجرا و در بک گراند قرار داده میشود استفاده میگردد. کار این دستور حذف کردن یک job شل از لیست job های اکتیو میباشد، بنابراین شما از دستورهای fb و bg روی آن job مورد نظر دیگر استفاده نخواهید کرد.
علاوه بر این زمانیکه شما ترمینال مورد نظر را میبندید job هنگ نخواهد کرد یا SIGHUP به هر یک از زیر job ها ارسال نخواهد کرد. مثال زیر درباره نحوه استفاده از diswon میباشد که یک function داخلی (built-in) بش "bash" است.
شما همچنین میتوانید از دستور nohup استفاده کنید که باعث میشود یک process بعد از خروج کاربر از شل به اجرای خود در background ادامه دهد.
مثال :
جدا کردن یک Process لینوکسی از ترمینال
کلا برای جدا کردن کامل یک process از یک terminal از فرمت دستور زیر استفاده کنید. که برای اپلیکیشن های با اینترفیس گرافیکی کاربر (GUI) همانند firefox بسیار موثرتر میباشد.
در لینوکس /dev/null فایل مربوط به دیوایس خاصی میباشد که از شر همه دیتای که در آن ریخته میشود خود را خلاص میکند و به اصطلاح دیتای منتقل شده به این دیوایس دور ریخته میشود. همانطور که در دستور بالا میبینید ورودی از آن خوانده و خروجی به /dev/null ارسال میشود.
توصیه میشود که مطالعه کنید : دستور screen در لینوکس برای مدیریت ترمینال ها به همراه 10 مثال عملی
به طور خلاصه در حین اجرا کردن یک process متصل به ترمینال شما با چندین خط خروجی از اطلاعات پروسس و پیغام های خطا روی ترمینال تان روبه رو خواهید شد، و دوباره تکرار میکنیم زمانی که شما این چنین ترمینالی را ببندید process ترمینال و child process ها (process دستور های در حال اجرا روی ترمینال) همگی بسته خواهند شد. امیدوارم این مقاله مفید واقع شده باشه. همچنان با ما باشید.
- ترمینال کنترل کننده دستور با دیتای خروجی زیاد و همچنین پیامهای خطا پر میشود.
- در زمانی که ترمینال بسته شود process ترمینال به همراه تمام زیر process های آن که یکی از آنها دستور در حال اجرای ما میباشد خاتمه میابد.
برای روبه رو با این دو مشکل شما نیاز دارید که به طور کامل یک process را از یک ترمینال جدا کنید. قبل از اینکه برای حل مشکل اقدامی انجام دهیم اجازه دهید به طور کلی نحوه اجرا کردن process ها در بک گراند را مورد بحث قرار دهیم.
نحوه شروع کردن یک Process لینوکس یا کامند در Background
اگر یک process از قبل در حال اجرا باشد همانند نمونه زیر از دستور tar شما به آسانی و با استفاده از Ctrl+z میتوانید آنرا stop کنید و سپس با دستور bg به ادامه اجرای دستور در بک گراند و به عنوان یک job اقدام کنید.
توصیه میشود که مطالعه کنید : آموزش دستور tar در لینوکس برای فشرده سازی و آرشیو فایل ها به همراه 18 مثال عملی
شما میتوانید تمام job های موجود در background را با تایپ کردن دستور jobs مشاهده کنید. به هر حال stdin, stdout, stderr مربوط به دستور همچنان به ترمینال متصل هستند.
کد PHP:
$ tar -czf home.tar.gz .$ bg$ jobs
کد PHP:
[root@elastix log]# tar -czf logs-backup.tar.gz .
^Z
[1]+ Stopped tar -czf logs-backup.tar.gz .
[root@elastix log]# bg
[1]+ tar -czf logs-backup.tar.gz . &
[root@elastix log]#
[root@elastix log]# jobs
[1]+ Running tar -czf logs-backup.tar.gz . &
[root@elastix log]#
کد PHP:
$ tar -czf home.tar.gz . &$ jobs
کد PHP:
[root@elastix log]# tar -czf logs-backup.tar.gz . &
[1] 14051
[root@elastix log]#
[root@elastix log]# jobs
[1]+ Running tar -czf logs-backup.tar.gz . &
[root@elastix log]#
کد PHP:
$ tar -czf home.tar.gz . &$ jobs
در حال اجرا نگه داشتن Process های لینوکسی بعد از خارج شدن از ترمینال
ما از دستور disown استفاده خواهیم کرد. این دستور بعد از اینکه یک pocess اجرا و در بک گراند قرار داده میشود استفاده میگردد. کار این دستور حذف کردن یک job شل از لیست job های اکتیو میباشد، بنابراین شما از دستورهای fb و bg روی آن job مورد نظر دیگر استفاده نخواهید کرد.
علاوه بر این زمانیکه شما ترمینال مورد نظر را میبندید job هنگ نخواهد کرد یا SIGHUP به هر یک از زیر job ها ارسال نخواهد کرد. مثال زیر درباره نحوه استفاده از diswon میباشد که یک function داخلی (built-in) بش "bash" است.
کد PHP:
$ sudo rsync Templates/* /var/www/html/files/ &$ jobs$ disown -h %1$ jobs
شما همچنین میتوانید از دستور nohup استفاده کنید که باعث میشود یک process بعد از خروج کاربر از شل به اجرای خود در background ادامه دهد.
کد PHP:
$ nohup tar -czf iso.tar.gz Templates/* &$ jobs
کد PHP:
[root@callcenter-back ~]# nohup java -jar /tmp/CallMananger_jar/CallMananger.jar &
[1] 21249
[root@callcenter-back ~]# nohup: ignoring input and appending output to `nohup.out'
[root@callcenter-back ~]#
[root@callcenter-back ~]# jobx
-bash: jobx: command not found
[root@callcenter-back ~]# jobs
[1]+ Running nohup java -jar /tmp/CallMananger_jar/CallMananger.jar &
[root@callcenter-back ~]#
جدا کردن یک Process لینوکسی از ترمینال
کلا برای جدا کردن کامل یک process از یک terminal از فرمت دستور زیر استفاده کنید. که برای اپلیکیشن های با اینترفیس گرافیکی کاربر (GUI) همانند firefox بسیار موثرتر میباشد.
کد PHP:
$ firefox </dev/null &>/dev/null &
توصیه میشود که مطالعه کنید : دستور screen در لینوکس برای مدیریت ترمینال ها به همراه 10 مثال عملی
به طور خلاصه در حین اجرا کردن یک process متصل به ترمینال شما با چندین خط خروجی از اطلاعات پروسس و پیغام های خطا روی ترمینال تان روبه رو خواهید شد، و دوباره تکرار میکنیم زمانی که شما این چنین ترمینالی را ببندید process ترمینال و child process ها (process دستور های در حال اجرا روی ترمینال) همگی بسته خواهند شد. امیدوارم این مقاله مفید واقع شده باشه. همچنان با ما باشید.