آموزش‌های خط فرمانی

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

آموزش‌های خط فرمانی

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

Process Management


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

مندرجات

  1. مبانی
  2. پرسش‌های ساده
    1. چگونه یک job پس‌زمینه اجرا کنم؟
    2. اسکریپت من یک job در پس‌زمینه اجرا می‌کند. چطور می‌توانم PID آن را به دست آورم؟
    3. خب، من PID آن را دارم. چگونه کنترل کنم که آیا هنوز در حال اجرا می‌باشد؟
    4. می‌خواهم با پردازشی که قبلاً شروع کرده‌ام، کاری انجام بدهم
    5. چگونه پردازش را توسط نام آن kill کنم؟ بیرون رفتن آن از ‎ps aux | grep‎ را لازم دارم ....
    6. اما من روی سیستم قدری قدیمی یونیکس سنتی هستم که pgrep ندارد! چکار کنم؟
    7. می‌خواهم موردی را در پس‌زمینه اجرا کنم و سپس قطع اتصال (log out) کنم.
    8. من سعی می‌کنم job خود را ‎kill -9‎ کنم، اما ...
    9. مطمئن شوید شما این فرمانها را اجرا کرده‌اید و فهمیده‌اید:
  3. پرسش‌های پیشرفته
    1. می‌خواهم دو job را در پس‌زمینه اجرا کنم، و سپس تا پایان یافتن هر دو منتظر بمانم.
    2. چگونه می‌توانم کنترل کنم که اگر سرویس‌دهنده game من هنوز در حال اجرا می‌باشد؟ من یک اسکریپت در crontab قرار بدهم، و اگر در حال اجرا نیست آن را مجدداً راه‌اندازی کنم...
    3. چگونه مطمئن شوم که در یک لحظه فقط یک نسخه از اسکریپت من می‌تواند اجرا گردد؟
    4. می‌خواهم یک دسته از فایلها را به طور موازی پردازش کنم، و موقعی که یکی تمام می‌شود، بعدی را شروع کنم. و می‌خواهم مطمئن شوم در هر لحظه دقیقاً پنج job در حال اجرا می‌باشد.
    5. اسکریپت من یک خط‌لوله را اجرا می‌کند. می‌خواهم وقتی اسکریپت کشته می‌شود، خط‌لوله نیز بمیرد.
  4. چگونگی کار کردن با پردازش ها
    1. PIDها و والدین
    2. ریسک اجازه مردن والد
    3. ریسک تجزیه درخت پردازش
    4. درست انجام بدهید
      1. شروع یک پردازش و به خاطر سپردن PID آن
      2. معاینه کامل پردازش خود یا خاتمه دادن آن
      3. شروع یک سرویس کمکی «daemon» و کنترل آنکه آیا به طور موفق شروع گردیده است
  5. در مورد پردازش‌ها، محیط‌ها و وراثت

مبانی

یک پردازش، نمونهِ در حال اجرایِ یک برنامه در حافظه است. هر پردازش به وسیله یک شماره تحت عنوان PID، یا تعیین کننده هویت پردازش شناخته می‌شود. هر پردازش دارای قطعهِ تخصیص یافته‌ای از حافظه است، که مخصوص خودش می‌باشد، و از سایر پردازشها قابل دستیابی نیست. این جایی است که پردازش متغیرها و سایر داده‌هایش را ذخیره می‌کند.

کرنل تمام این پردازشها را پیگردی می‌کند، و مقدار اندکی از فوق‌داده‌های اصلی در باره آنها را در جدول پردازش ذخیره می‌نماید. به هرحال، هر پردازش در حدود حقوق ویژه اعطایی توسط کرنل، خود مختار است. وقتی یک پردازش آغاز شده باشد، انجام هر کاری با آن غیر از تعلیق(pause)، یا خاتمه دادن آن دشوار است.

فوق‌داده‌های ذخیره شده توسط کرنل، یک «نام» پردازش و «سطر فرمان» را شامل می‌گردد. این موارد قابل اعتماد نیستند، «نام» پردازش آن است که شما وقتی برنامه را اجرا کردید، بیان نمودید، و ممکن است هیچگونه رابطه‌ای با نام فایل برنامه نداشته باشد. (در برخی سیستم‌ها، پردازشهای در حال اجرا نام خودشان را نیز می‌توانند تغییر بدهند. برای مثال، sendmail از این مورد برای نشان دادن وضعیت خود استفاده می‌کند.) بنابراین، موقع کار با یک پردازش، برای اینکه قادر باشید با آن کاری انجام بدهید باید PID آن را بدانید. جستجوی پردازش‌ها به وسیله نام، به شدت لغزش‌پذیر است.

ادامه مطلب

ssh keys


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

نگاه کلی

این نظر اجمالی، مفاهیم اصلی تصدیق اعتبار کلید عمومی را برای آنهایی که هنوز چیز زیادی در مورد آن نمی‌دانند، شرح می‌دهد.

کلید عمومی اعتبار سنجی، به کار بردن رمزنگاری برای اثبات آنکه شما مالک مطمئن اعتبارنامه می‌باشید را شامل می‌گردد، بدون آنکه واقعاً آن اعتبارنامه را برای طرف دیگر آشکار سازد. مخصوصاً، سرویس‌گیرنده یک کلید خصوصی را نگهداری می‌کند، که ممکن است با یک عبارت عبور رمزی شده یا نشده باشد. سرویس‌دهنده یک کلید عمومی را نگهداری می‌کند. سرویس‌دهنده و گیرنده یک روش Zero-knowledge proof ‎ [1] ‎  را به کار می‌برند، که در این روش سرویس‌گیرنده ثابت می‌کند که نگهدارنده کلید خصوصی است، اما در عمل کلید محرمانه را انتقال نمی‌دهد.

ادامه مطلب

سیگنال‌ها و trapها


ارسال و به دام انداختن سیگنالها

سیگنال‌ها ابزار اصلی برای ارتباطات میان‌پردازشی غیر همزمان می‌باشند. یعنی یک پردازش ‎(A)‎ می‌تواند به پردازش دیگر ‎(B)‎ بگوید در یک زمانی که به جای پردازش B توسط پردازش A انتخاب شده، کاری را انجام بدهد. (مانند جستجوی یک فایل توسط پردازش B هر چند ثانیه یکبار، این عمل polling نامیده می‌شود و زمان‌بندی آن به جای پردازش A توسط پردازش B کنترل می‌شود.)

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

غیر از اینکه پردازش از قبل فرمان خاصی بگیرد، اکثر سیگنالها کُشنده هستند، یعنی عمل پیش‌فرضی که یک پردازش به مجرد دریافت یک سیگنال انجام خواهد داد، یک خروج بی‌درنگ است. (استثناها: SIGCHLD به طور پیش‌فرض صرفنظر می‌گردد، SIGSTOP پردازش را متوقف می‌سازد، و SIGCONT پردازش را از سر می‌گیرد.) برخی سیگنالها (از قبیل SIGQUIT) نیز باعث می‌شوند پردازش علاوه بر خروج یک فایل core باقی بگذارد.

1. تله‌ها، یا اداره‌کنندگان سیگنال

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

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

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

در یک اسکریپت پوسته، trap فرمان مورد استفاده برای برقرار کردن یک گرداننده سیگنال است. فرمان trap به پنج روش مختلف می‌تواند استفاده شود:

ادامه مطلب

منطقه


منطقه

1. کد گذاری‌های کاراکتری

در عمل کامپیوترها نمی‌توانند کاراکترها و علائم را ذخیره کنند، آنها فقط اعداد را ذخیره می‌کنند. روشهای بیشماری برای نمایش دادن کاراکترهای زبان انسانی( مانند حرف A، علامت به اضافه، وغیره ) به عنوان عدد، وجود دارد، و این امر که روشهای متفاوت بسیار زیادی، واقعاً به کار برده شد، به بی‌نظمی منجر گردیده است.

کامپیوترهای اولیه (حداقل در ایالات متحده) در دو استاندارد برای طرح‌ریزی(نگاشت) کاراکترهای ‎ US English‎ به اعداد و بالعکس، به یکدیگر نزدیک شدند: ASCII و EBCDIC. دومی به تدریج تا اواخر قرن بیستم منسوخ گردید و ASCII ( کد استاندارد امریکایی برای تبادل اطلاعات) را به عنوان استاندارد اصلی باقی گذاشت.

مشکل با ASCII آن است که برای زبانهای غیر از انگلیسی، یا حتی برای برخی کلمات انگیسیِ وابسته به مزیت‌های انشایی نویسنده، یا شاید نوشته شده با آوا نماها (به عنوان مثال rôle و naïve) خیلی محدود است. ASCII تنها بیست و شش حرف از الفبای انگلیسی (بزرگ و کوچک)، ارقام 0 تا 9، و مقداری نشانه‌گذاری اصلی را پوشش می‌دهد -- به طور معمول آنهایی که شما در صفحه کلید US کامپیوتر می‌بینید. در ماشین‌های یونیکسی برای دیدن فهرست آنها می‌توانید ‎man ascii‎ را تایپ کنید.

اکثر کامپیوترها از یک بایت هشت بیتی به عنوان واحد ذخیره‌شان (یعنی یک دامنه از 0 تا 255 هنگامی که مانند اعداد صحیح غیر منفی بیان می‌شوند) استفاده می‌کنند. ASCII فقط کاراکترهای هفت بیتی (0 تا 127) تعریف می‌کند، یک میرات روزهایی که ارتباطات راه دور داده‌ها به طور قابل ملاحظه‌ای آهسته و بیشتر مستعد خطا بود. چون ASCII تنها نصف محدوده یک بایت را استفاده می‌کند، این مطلب فضایی را برای افراد باقی گذاشت که مجموعه‌های کاراکتری خودشان را داخل یک بایت منفرد تعریف کنند.

(بسیاری از کاربران ‎DOS/Windows‎ مایکروسافت باور دارند که ASCII تمام دامنه 0 تا 255 را با صورتک‌های خندان و کاراکترهای ترسیم خطوط و مانند آن پوشش می‌دهد. این تصور نادرست است. مجموعه کاراکتر معروف DOS در حقیقت ‎IBM code page 437‎ است، که یکی از چندین فوق‌مجموعه ASCII می‌باشد. ASCII خودش منحصر به 127 کاراکتر است.)

ادامه مطلب

فایل‌های الگو


فایلهای قالب پوسته

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

اساسی‌ترین نیاز آن است که autoconf گنو به کار می‌برد: یک فایل الگوی پیش‌ساخته با مواردی %PLACEHOLDER% در آن، و کمیت‌هایی در متغیرهای ویژه پوسته که می‌خواهیم استفاده کنیم. بر این وظیفه بخصوص، sed بسیار خوب منطبق می‌شود:

 sed -e "s/%PLACEHOLDER%/$variable/g" \
     -e "s/%FIRSTNAME%/$firstname/g" \
     ... "$templatefile" > "$outputfile"

نشانه‌گذاری %FOO% همان است که autoconf عملاً برای placeholderهایش استفاده می‌کند، انتخابش به این جهت است. اگر متغیرها بتوانند شامل کاراکترهای / یا سطر جدید در محتوایشان باشند، آنوقت گام‌های متناسب باید برداشته شود -- یک جدا کننده غیر از / می‌تواند برای فرمان ‎sed s///‎ استفاده بشود، اما برای سطر جدید به شما توصیه می‌شود یک پرسش و پاسخ متداول پیشرفته sed را کنکاش نمایید. خوشبختانه، وضعیتی که افراد بخواهند سطرهای جدید را به جایگزینی‌هایشان ضمیمه کنند، در این شکل از پرسش، تا اندازه‌ای غیر معمول است.

یک شکلِ جایگزین این پرسش عبارت است از، «من یک فایل با بسط پارامترهای پوسته در آن دارم، مانند ‎$foo‎. من از قبل نمی‌دانم کدام متغیرها استفاده خواهند شد، بنابراین نمی‌توانم دقیقاً یک لیست از تمام آنها دریک فرمان تنومند sed بسازم.» (در اینجا سطرهای جدید داخل متغیرها خیلی بیشتر معمول هستند، اما خوشبختانه آنها مشکلی در راه حلی که ارایه می‌دهیم نشان نمی‌دهند.)

این مشکل می‌تواند به وسیله ساختن یک HereDocument و تغذیه نتیجه به یک پوسته برای بسط یافتن، حل بشود:

 { echo "cat <<EOF"
   cat "$templatefile"
   echo "EOF"
 } | sh > "$outputfile"

توجه: اگر یک نتیجه غیرمنتظره که شامل EOF در انتهای خروجی است، به دست می‌آورید، احتمالاً فایل الگوی شما فاقد کاراکتر سطرجدید در انتها می‌باشد.

به خاطر بیاورید تا زمانی که رشته نگهبان (در موقعیت ما EOF) در سطر اول نقل‌قولی نشده باشد در بدنه یک HereDocument جایگزینی‌ها انجام می‌شوند. ما در اینجا از این مطلب بهره‌گیری می‌کنیم.

همچنین، توجه نمایید که جایگزینی در یک پوسته جدید sh (یا bash یا ksh، هر چه که شما لازم دارید) انجام می‌شود، نه در پوسته جاری. بنابراین، هر متغیری که شما می‌خواهید استفاده کنید باید export شده باشد.

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


CategoryShell

فایلهای الگو (آخرین ویرایش ‎2010-08-26 15:12:58‎ توسط cei-gla-cpk2)