انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: اجرای دستور shell داخل حلقه  (دفعات بازدید: 4330 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین ARH

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
  • Hardware Enthusiast
    • پروفايل شخصي من در گوگل
اجرای دستور shell داخل حلقه
« : 08 امرداد 1388، 04:52 ب‌ظ »
سلام
نظرتون در مورد این اسکریت Shell که نوشتم چیه ؟

for(( i = 0 ; i < $ITERATION ; i++ ))
do
run_crafty
done

من اسکریپتی که شامل این تیکه کد میشه رو می‌گذارم اجرا بشه اما بعد توی kill کردن run_crafty میمونم و نمی‌دونم باید چی کار بکنم! مثلا اگر حلقه ۵۰۰ تا دور بخواد بزنه منم باید ۵۰۰ بار این run_crafty رو kill کنم اگر یک جاییش مشکل داشته باشه و نخوام که اجرا بشه !
شما راه کار بهتری برای run_crafty یا Kill  کردنش سراغ دارید ؟

آفلاین جادی

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1610
    • در دفاع از آزادی بیان
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #1 : 08 امرداد 1388، 06:51 ب‌ظ »
راستش من چیزی نفهمیدم (: مشکل چیه؟‌ run_crafty چیه؟ (:‌ دستور killall رو هم نگاه کن.
آزادی کیبورد حق هر انسان است - جادی

آفلاین ARH

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
  • Hardware Enthusiast
    • پروفايل شخصي من در گوگل
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #2 : 08 امرداد 1388، 07:29 ب‌ظ »
راستش من چیزی نفهمیدم (: مشکل چیه؟‌ run_crafty چیه؟ (:‌ دستور killall رو هم نگاه کن.

run_crafty چیز مهمی نیست ... فکر کن یک دستور هست که یک process رو اجرا میکنه و این process باید ۵۰۰ بار پشت سر هم صدا زده بشه !
اما یک هو وسط کار می‌بینم که برنامه از روند معمولش خارج شده و باید killall بکنمش ! اما نمی‌تونم ۵۰۰ تا killall دستی بزنم ! تو حلقه هم اگر بندازم فقط اولین run_crafty رو kill میکنه بقیه‌اش رو میگه همچین پروسسی نیست بعد که تموم میشه run_crafty دومی اجرا میشه ! منظورم اینه که اینا پشت‌سر هم اجرا می‌شوند نه به صورت موازی هم .

آفلاین جادی

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1610
    • در دفاع از آزادی بیان
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #3 : 10 امرداد 1388، 12:10 ب‌ظ »
خب فکر کنم توی اصل سوال مشکل داریم. سوال دقیق نیست.
تو یک برنامه رو پونصد بار اجرا می کنی. این پونصد بار پشت سر هم است یا همزمان؟ در ظاهر بگیریم پشت سر هم. یعنی یکی که تموم می شه، بعدی اجرا می شه. حالا مشکل چیه؟ کشف می کنی که یک مشکل هست؟ خب اول باید اسکریپت رو قطع کنی و بعد پروسه در حال اجرا رو و همه چیز تموم می شه.
حالا مشکل چیه؟
اگر هم همه همزمان اجرا می شن که می تونی با یک killall همه رو بکشی و خلاص (:
یا من متوجه مشکل نمی شم یا داستان واقعا دقیق نیست.
آزادی کیبورد حق هر انسان است - جادی

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #4 : 10 امرداد 1388، 02:47 ب‌ظ »
بله باید پروسهٔ اون اسکریپت رو kill کنید. اگه منظورتون اینه که اسکریپت kill نشه و فقط از حلقه خارج بشه(مثل اینکه داخلش break نوشته باشید) فکر نکنم همچین چیزی ممکن باشه!! مگه اینکه اون اسکریپت رو تغییر بدید و داخل حلقهٔ for یه شرطی بذارید که اگه مثلاً فلان (مثلاً tmp/stop_crafty/ )وجود داشت، از حلقه break بشه. بعد هر وقت خواستید وسط اجرای اسکریپت، میتونید اون فایل رو بجود بیارید تا حلقه break بشه و پروسهٔ run_crafty دیگه ایجاد نشه. و اون یه دونه پروسهٔ run_crafty هم که در حال اجرا هست، killall کنید.
for(( i = 0 ; i < $ITERATION ; i++ ))
do
if [ -f /tmp/stop_crafty ] ; then
break
fi
run_crafty
done

touch /tmp/stop_crafty
killall run_crafty
« آخرین ویرایش: 10 امرداد 1388، 02:50 ب‌ظ توسط ilius »

آفلاین فاراب

  • High Hero Member
  • *
  • ارسال: 1352
  • آزادی
    • پروفایل لینکداین
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #5 : 10 امرداد 1388، 04:04 ب‌ظ »
میتونی برای هر run_crafty یه شمارنده بذاری. مثل یه آرایه که با شمارنده‌ی حلقه که i هست پر میشه. بعد میتونی هر کدوم ر، که خواستی در صورت بروز خطا با یه حلقه دیگه ببندی.
راستی فکر میکنم برای منظور شما while بهتر باشه.
Godisnowhere

آفلاین ARH

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
  • Hardware Enthusiast
    • پروفايل شخصي من در گوگل
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #6 : 10 امرداد 1388، 08:50 ب‌ظ »
خب فکر کنم توی اصل سوال مشکل داریم. سوال دقیق نیست.
تو یک برنامه رو پونصد بار اجرا می کنی. این پونصد بار پشت سر هم است یا همزمان؟ در ظاهر بگیریم پشت سر هم. یعنی یکی که تموم می شه، بعدی اجرا می شه. حالا مشکل چیه؟ کشف می کنی که یک مشکل هست؟ خب اول باید اسکریپت رو قطع کنی و بعد پروسه در حال اجرا رو و همه چیز تموم می شه.
حالا مشکل چیه؟
اگر هم همه همزمان اجرا می شن که می تونی با یک killall همه رو بکشی و خلاص (:
یا من متوجه مشکل نمی شم یا داستان واقعا دقیق نیست.

سلام
خوب وقتی اسکریپت داره تو بک‌گراند اجرا میشه که نمی‌شه قطعش کرد اگر killall بکنش دوباره می‌افته تو loop بعدی و اجرا میشه !
من چون این اسکریپت‌ها رو ریموت اجرا میکنم حتمی باید تو بک‌گراند بگذارم اجرا بشه تا اولا وقتی از رموت در آمدم این کارش رو ادامه دوما بتونم روند اجراش و تولید خروجی‌هاش رو چک کنم.

اجرای هرکدوم از run_crafty ها بعد از پایان run_crafty قبلی صورت میگیره ! اگر قرار بود که همزمان باشند باید دستور رو اینجوری مینوشتم : run_crafty &

آفلاین ARH

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
  • Hardware Enthusiast
    • پروفايل شخصي من در گوگل
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #7 : 10 امرداد 1388، 08:52 ب‌ظ »
بله باید پروسهٔ اون اسکریپت رو kill کنید. اگه منظورتون اینه که اسکریپت kill نشه و فقط از حلقه خارج بشه(مثل اینکه داخلش break نوشته باشید) فکر نکنم همچین چیزی ممکن باشه!! مگه اینکه اون اسکریپت رو تغییر بدید و داخل حلقهٔ for یه شرطی بذارید که اگه مثلاً فلان (مثلاً tmp/stop_crafty/ )وجود داشت، از حلقه break بشه. بعد هر وقت خواستید وسط اجرای اسکریپت، میتونید اون فایل رو بجود بیارید تا حلقه break بشه و پروسهٔ run_crafty دیگه ایجاد نشه. و اون یه دونه پروسهٔ run_crafty هم که در حال اجرا هست، killall کنید.
for(( i = 0 ; i < $ITERATION ; i++ ))
do
if [ -f /tmp/stop_crafty ] ; then
break
fi
run_crafty
done

touch /tmp/stop_crafty
killall run_crafty

ایده جالبیه ... خیلی ممنونم فکر کنم با همینی که شما گفتی کارم راه بیوفته.

آفلاین ARH

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
  • Hardware Enthusiast
    • پروفايل شخصي من در گوگل
پاسخ به: اجرای دستور shell داخل حلقه
« پاسخ #8 : 10 امرداد 1388، 08:55 ب‌ظ »
میتونی برای هر run_crafty یه شمارنده بذاری. مثل یه آرایه که با شمارنده‌ی حلقه که i هست پر میشه. بعد میتونی هر کدوم ر، که خواستی در صورت بروز خطا با یه حلقه دیگه ببندی.
راستی فکر میکنم برای منظور شما while بهتر باشه.

دقیق متوجه نشدم که منظورتون چی هست اما یک ایده جالب از صحبت‌هاتون برای این کار گرفتم. کد رو نگاه کنید لطفا :
for(( i = 0 ; i < $ITERATION ; i++ ))
   do
      run_crafty
   done

حالا من اگر این دو تا دستور رو بزنم به نظر شما کل اسکریپت kill میشه ؟
ITERATION=0
killall run_crafty

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