پرسش و پاسخ شماره ۲۷ - آموزش اسکریپت نویسی
X
تبلیغات
رایتل

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

پرسش و پاسخ شماره ۲۷

پرسش و پاسخ شماره ۲۷

چطور می‌توان دو پردازش جداگانه را به هم ارتباط داد؟

دو فرآیند نا مرتبط نمی‌توانند از شناسه‌ها، محیط یا stdin/stdout برای مراوده استفاده کنند، برخی اشکال ارتباط درون فرآیندی(IPC) لازم است.

فایل

پردازش A در یک فایل می‌نویسد، و پردازش B فایل را می‌خواند. این شیوه همگام شده نمی‌باشد، بنابراین اگر در حالیکه A در فایل می‌نویسد، B بتواند آنرا بخواند، یک روش مطمئن نیست. شاید قفل دایرکتوری، یا سیگنال بتواند کمک کند.

دایرکتوری به عنوان قفل

mkdir می‌تواند برای بررسی وجود یک شاخه و ایجاد آن در یک عملیات تجزیه ناپذیر به کار برود، بدین ترتیب می‌تواند به عنوان یک قفل به کار برود، گرچه روش خیلی مؤثری نیست.

اسکریپت A:

  until mkdir /tmp/dir;do   # تا بتوانیم شاخه را ایجاد نماییم منتظر می‌ماند
    sleep 1
  done
  echo foo > file            # نوشتن در فایل، این بخش  حساس است
  rmdir /tmp/dir             # پاک کردن قفل

اسکریپت B:

  until mkdir /tmp/dir;do    #انتظار تا بتوانیم دایرکتوری را ایجاد کنیم
    sleep 1
  done
  read var < file            # خواندن فایل، این بخش حساس است
  echo "$var"                # نمی‌تواند در فایل بنویسد A اسکریپت
  rmdir /tmp/dir             # حذف قفل

برای مثالهای بیشتر قفل دایرکتوری، پرسش و پاسخ شماره 45 و mutex را ببینید.

سیگنال‌ها

سیگنالها احتمالاً ساده‌ترین شکل IPC(مترجم: مخفف InterProcess Communication یا ارتباط درون فرآیندی) می‌باشند:

اسکریپت A:

  trap 'flag=go' USR1            # USR1 تنظیم اداره کننده سیگنال برای سیگنال

  # echo $$ > /tmp/ScriptA.pid   # را در یک فایل ذخیره کنیم pid اگر بخواهیم

  flag=""
  while [[ $flag != go ]]; do    #  B انتظار برای چراغ سبز از اسکریپت
    sleep 1;
  done
  echo we received the signal

شما باید pid اسکریپت دیگر را برای ارسال یک سیگنال جهت کشتن آن، بدانید یا پیداکنید :

   #kill all the
   pkill -USR1 -f ScriptA 
 
   #  خود را در فایل ذخیره کرده باشد pid شماره A اگر اسکریپت  
   kill -USR1 $(</var/run/ScriptA.pid)

   #   :فرزند باشد A اگر اسکریپت 
   ScriptA & pid=$!
   kill -USR1 $pid

دو روش اول ضد گلوله نیستند و اگر شما بیش از یک نمونه از اسکریپت A را اجرا نمایید موجب دردسر خواهند شد.

لوله‌های با نام

لوله‌های با نام شکل بیشتر توانمند IPC هستند. آنها در صفحه خودشان تشریح شده‌اند: NamedPipes.


CategoryShell

پرسش و پاسخ 27 (آخرین ویرایش ‎ 2010-05-11 05:25:30 ‎ توسط p5B09615D)