شما هنوز به سیستم وارد نشده اید.

#1 2016-12-26 13:51:32

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

اجرای دستور در شل جدید توسط شل قبل [حل شد]

سلام. پیشاپیش بابت موضوع گنگ تاپیک عذرخواهی میکنم. در صورت امکان، برای درک بهتر تاپیک موضوعی را پیشنهاد بفرمایید.

۱-سوال اول

* حالت اول
فرض کنید که ما توسط ترمینال شل جدیدی را باز کنیم و بخواهیم توسط شل قبل در شل فعلی دستوری را اجرا کنیم چه راهی را پیشنهاد میدهید. برای درک بهتر، مثال زیر را در نظر بگیرید:
می خواهیم برای نمایش صحیح واژه های فارسی در نرم افزار مدیریت پرونده ی ranger، قبل از اجرای این نرم افزار، بسته ی bicon را اجرا کنیم. می دانیم که با اجرای بسته ی bicon توسط ترمینال، شل جدید باز شده و این نرم افزار در شل جدید در حال اجرا می ماند و دستورهای بعد در این شل قابل اجرا هستند. حال فرض کنیم که میخواهیم دستوری دو بخشی را صادر کنیم به این شکل که ابتدا bicon اجرا شده سپس در شل جدیدی که باز شده بخش دوم دستور مثلا ranger اجرا شود.
* حالت دوم
شکل دیگر این فرآیند، احضار شل جدید توسط pid است. شاید امکان احضار شل جدید توسط pid وجود داشته باشد که بخش دوم دستور مذکور با فراخوانی pid قابل اجرا شود.

۲-سوال دوم

آیا امکان جابجایی بین شل ها وجود دارد؟

شاید هر دو سوال و هر دو حالت یک مفهوم را برسانند.
سپاس از همگی دوستان

آخرین ویرایش توسط farid (2017-01-02 12:54:32)

آفلاین

#2 2016-12-28 19:34:32

Arcush
Moderator
ثبت شده: 2015-09-15
ارسال ها: 1,281

پاسخ: اجرای دستور در شل جدید توسط شل قبل [حل شد]

من مطمئن نیستم که منظورتون رو فهمیده باشم. اما دو تا سؤال دارم (برای اینکه فکر می کنم با این دو تا سؤال، بهتر میتونم متوجه بشم):

۱- آیا این لینک کوچکترین کمکی نمی کنه (علی الخصوص آپشن c)؟
http://askubuntu.com/questions/484993/r … nal-window

۲- چرا به چنین حالتی نیاز دارید؟

آفلاین

#3 2016-12-28 20:38:46

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: اجرای دستور در شل جدید توسط شل قبل [حل شد]

Arcush نوشته است که:

من مطمئن نیستم که منظورتون رو فهمیده باشم. اما دو تا سؤال دارم (برای اینکه فکر می کنم با این دو تا سؤال، بهتر میتونم متوجه بشم):

۱- آیا این لینک کوچکترین کمکی نمی کنه (علی الخصوص آپشن c)؟
http://askubuntu.com/questions/484993/r … nal-window

۲- چرا به چنین حالتی نیاز دارید؟

شاید سوال من آنچنان که باید شفاف نبود و البته شاید سوال مشکل بنیادی داشته باشد.
در واقع ما آگاهیم که قرار گرفتن دستور در پرانتز موجب اجرای دستور در شل جدیدی می شود. برای مثال (echo "hello") دستور echo را در شل جدید اجرا کرده  و به شل قبل برمی گردد. و می دانیم که با اجرای دستور bash بر روی شل فعلی شل جدیدی  باز می شود که ما قادریم از این شل خارج شده و به شل قبل برگردیم. البته گفتن sub shell شاید خیلی خیلی مناسب تر باشد. فرض کنیم که ما می خواهیم بدون بستن زیرشل جدید به شل قبل برگردیم یا سوییچ کنیم. آیا راهی برای این کار هست؟

آفلاین

#4 2016-12-30 10:26:46

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: اجرای دستور در شل جدید توسط شل قبل [حل شد]

یکی از راه هایی که می تواند به ما کمک کند استفاده از دستور kill برای ارسال سیگنال های متفاوت به فرآیند است. میدانیم که توسط دستور

kill -l

می توانیم لیست سیگنال هایی که توسط دستور kill پشتیبانی می شوند و قابل ارسال به فرآیند (process) هستند را نمایش دهیم.

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

هر کدام از این سیگنال ها برای هدفی استفاده می شوند. اما در مورد موضوع تاپیک می توانیم از سیگنال های SIGSTOP و SIGHUP و همچنین دستورهایی مانند fg و bg استفاده کنیم.برای درک بیشتر به مثال زیر توجه کنید:

farid@Glass-World:~$ echo $$
1752
farid@Glass-World:~$ bash
farid@Glass-World:~$ echo $$
1816
farid@Glass-World:~$ kill -s sigstop $$

[1]+  Stopped                 bash
farid@Glass-World:~$ echo $$
1752
farid@Glass-World:~$ fg
bash
farid@Glass-World:~$ echo $$
1816
farid@Glass-World:~$ 

ابتدا توسط

echo $$

مقدار pid شل فعلی را نمایش می دهیم. سپس با دستور bash زیرشل جدیدی را ایجاد (باز) می کنیم. و دوباره pid زیرشل را نمایش می دهیم. اکنون برای pause کردن زیر شل فعلی و بازگشت به شل اصلی می توانیم از دستور

kill -s sigstop $$

استفاده کنیم. برای اطمینان از اینکه ما در شل اصلی قرار گرفته ایم دوباره مقدار pid را فراخوانی می کنیم. pid به ما می گوید که در شل اصلی وارد شده ایم. برای بازگشت به زیرشل نیز میتوانیم از دستور fg استفاده کنیم.

آخرین ویرایش توسط farid (2016-12-30 10:27:13)

آفلاین

#5 2017-01-02 12:43:08

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: اجرای دستور در شل جدید توسط شل قبل [حل شد]

تا حدودی این مشکل با استفاده از نرم افزار screen رفع خواهد شد. نرم افزار screen یک نرم افزار مدیر پنجره با کارکردی شبیه i3wm می باشد ولی با این تفاوت که مدیریت شل ها و زیر شل ها را به عهده می گیرید. درواقع این نرم افزار یک پنجره شبیه ساز ترمینال را با تعدادی شل یا زیر شل به اشتراک می گذارد و قابلیت های زیادی را به کاربر برای مدیریت این شل ها می دهد. این نرم افزار بیشتر برای مدیریت از راه دور سیستم کاربرد دارد. برای مثال زمانی که ما با پروتکل ssh ارتباطی برقرار می کنیم شاید نیازمند به این باشیم که تعدادی دستور را در شل های مختلف و مستقل، همزمان مدیریت کنیم. به دلیل استقلال شل ها و پنجره ها تمامی دستوراتی که در شل مخصوص به خود اجرا می شود در حال اجرا می ماند. تعدادی از توانایی ها و ویژگی هایی که این ابزار در اختیار کاربر می گذارد به شرح زیر است:
۱- استفاده ی همزمان از چند شل در یک پنجره توسط یک نشست
۲- نگهداری شل ها در حالت فعال حتی در زمان اختلال شبکه
۳- اجرای پردازش های طولانی بدون نگهداری شل در حالت فعال
این ابزار دارای کلیدهای زیادی است که تا حد توان در این تاپیک به تشریح این کلیدها و دستورات خواهم پرداخت.

شروع:
اجرای دستور screen در شبیه ساز ترمینال ما را به محیط screen هدایت خواهد کرد.
برای تعامل با این محیط و این نرم افزار کلید میانبر ctrl-a ایجاد شده است. که با فشردن این کلید میانبر ارتباط ما با شل قطع شده و ما با نرم افزار screen در ارتباط خواهیم بود.برای مثال اگر بعد از فشردن crtl-a کلید ”?” را فشار بدهیم صفحه ی راهنمای نرم افزار نمایش داده خواهد شد.

                                                             Screen key bindings, page 1 of 1.

                                                             Command key:  ^A   Literal ^A:  a

  break       ^B b         flow        ^F f         lockscreen  ^X x         pow_break   B            screen      ^C c         width       W         
  clear       C            focus       ^I           log         H            pow_detach  D            select      '            windows     ^W w      
  colon       :            hardcopy    h            login       L            prev        ^H ^P p ^?   silence     _            wrap        ^R r      
  copy        ^[ [         help        ?            meta        a            quit        \            split       S            writebuf    >         
  detach      ^D d         history     { }          monitor     M            readbuf     <            suspend     ^Z z         xoff        ^S s      
  digraph     ^V           info        i            next        ^@ ^N sp n   redisplay   ^L l         time        ^T t         xon         ^Q q      
  displays    *            kill        K k          number      N            remove      X            title       A         
  dumptermcap .            lastmsg     ^M m         only        Q            removebuf   =            vbell       ^G        
  fit         F            license     ,            other       ^A           reset       Z            version     v         

^]   paste .
"    windowlist -b
-    select -
0    select 0
1    select 1
2    select 2
3    select 3
4    select 4
5    select 5
6    select 6
7    select 7
8    select 8
9    select 9
I    login on
O    login off
]    paste .
|    split -v
:kB: focus prev








                                                              [Press Space or Return to end.]

در این صفحه دستورات و کلیدهای میانبر به اختصار نمایش داده شده است.
ایجاد پنجره یا شل جدید
برای ایجاد پنجره ها از کلید c استفاده میشود. درواقع این پنجره ها همان شل های جدیدی هستند که در اختیار ما گذاشته می شود. پس ایجاد شل جدید از این راه ممکن خواهد بود:

ctrl-a c

همانطور که گفته شد ایجاد پنجره های مستقل از ویژگی های این ابزار است. برای مثال بعد از ساختن اولین پنجره، ما دستور top را اجرا و سپس با همین فرمان (ctrl-a c) و بدون توقف دستور top، شل جدیدی را ایجاد می کنیم. (دستور top در حالت فعال باقی خواهد ماند)

سوییچ کردن یا جا به جایی بین پنجره ها (شل ها):
اکنون ما تعدادی شل فعال روبرو هستیم که در هر لحظه احتمال نیاز داشتن به یکی از شل ها و دستور در حال اجرای آن شل، احساس خواهد شد.
در نرم افزار screen امکان سوییچ کردن یا جا به جا شدن بین پنجره ی شل ها نیز وجود دارد که با دو دستور زیر می توان این امر را محقق کرد.
Ctrl-a n برای جا به جایی رو به جلو (شل بعدی)
ctrl-a p برای جا به جایی به پشت (شل قبلی)
جدایی و اتصال مجدد
اما در این پاراگراف به یکی از ویژگی های قدرتمند screen اشاره خواهیم کرد. این ویژگی، توانایی جدا شدن و اتصال دوباره به شل اصلی را به ما خواهد داد.

Ctrl-a d

با اجرای این دستور ما در شل اصلی خود قرار می گیریم. اما برای بازگشت دوباره به شل های ایجاد شده در محیط screen و تعامل با این محیط، دستور

screen -r

استفاده می شود. که قاعدتاً این دستور در شل اصلی اجرا میشود.
ایجاد log
از دیگر موارد مفید قابل استفاده، تولید گزارش هایی است که میتواند توسط ما در هر شل برای دستور مورد نظر ایجاد شود که برای این منظور از دستور

ctrl-a H

استفاده میکنیم.(به حروف بزرگ دقت شود)

مونیتور کردن دستور
گاهی ما دستوراتی را اجرا می کنیم که ممکن است تولید خروجی توسط این دستور یا به پایان رسیدن این دستور کمی زمان بر باشد. برای مثال دانلود یک فایل حجیم می تواند مدت زمان زیادی را صرف خود کند. یکی از راه های پیش روی کاربر مراجعه ی پی  در پی به پنجره ی مورد نظر و کنترل وضعیت دستور است اما راه دیگری که screen، به جهت جلوگیری از اتلاف زمان زیاد، در اختیار کاربر می گذارد ایجاد پیام های هشدار برای آن پنجره یا شل توسط دستور زیر است

ctrl-a M

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

ctrl-a x

انجام می پذیرد
خروج از شل ها و screen
در پایان فعالیت ها بهتر است از هر شل و از محیط screen با دستور exit خارج شویم. گفتنی ست راه دیگر خروج از پنجره ها و شل ها دستور

 ctrl-a K

می باشد.
همچنین می توان توسط دستور بعد به طور کامل تمام پنجره ها را متوقف کرد.

ctrl-a \

فراخوانی شل ها
دستور screen -ls لیست  شل های باز شده را نمایش می دهد.
هر کدام از این شل ها دارای pid منحصر به فردی هستند که فراخوانی آن ها هم توسط screen -r انجام می شود. به این شکل که بعد از گرفتن لیست خروجی در کنار اسم هر شل، pid مورد نظر قابل مشاهده است و ما با دستور زیر آن را بر می گردانیم.

screen -r screenpid

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

screen -d -R sessionname

قابل انجام است.

farid@Glass-World:~$ screen -ls
There are screens on:
	24275.pts-0.Glass-World	(Attached)
	22447.pts-3.Glass-World	(Attached)
2 Sockets in /run/screens/S-farid.
farid@Glass-World:~$ screen -d -R 24275.pts-0.Glass-World

ارسال دستور
یکی از سوالاتی که در این تاپیک وجود داشت ارسال دستور به شل مورد نظر بود. ارسال دستور از طریق پنجره ی شبیه ساز در  محل دیگری از سیستم، به نشست مورد نظر نیز امکان پذیراست.

screen -S sessionname -X stuff 'command'`echo -ne '\015'`

در این خط، مقدار echo -ne '\015' عملی شبیه return را انجام می دهد.
ایجاد شل هم زمان با نام گذاری
برای ایجاد پنجره ای که دارای نام خاصی باشد می توانیم از دستور زیر استفاده کنیم

screen -S yourname

تعداد زیادی از دستورها و کلیدهای میانبر در اینجا ذکر نشده که شما می توانید برای آگاهی از آن ها به صفحه ی راهنمای نرم افزار مراجعه کنید.

آفلاین

#6 2017-01-02 14:39:42

Arcush
Moderator
ثبت شده: 2015-09-15
ارسال ها: 1,281

پاسخ: اجرای دستور در شل جدید توسط شل قبل [حل شد]

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

آخرین ویرایش توسط Arcush (2017-01-02 14:42:10)

آفلاین

#7 2017-01-02 15:14:17

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: اجرای دستور در شل جدید توسط شل قبل [حل شد]

Arcush نوشته است که:

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

لطف دارید.
من هم، از در کنار شما بودن لذت می برم و بسیار خوشحالم smile

آفلاین

پانوشت انجمن

پشتیبانی توسط تیم آرچ لینوکس ایران و نیرو گرفته با FluxBB