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

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

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

نویسنده موضوع: خاموش کردن بعد از اتمام کار یک برنامه  (دفعات بازدید: 9779 بار)

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

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
خاموش کردن بعد از اتمام کار یک برنامه
« : 01 خرداد 1390، 09:03 ب‌ظ »
سلام
بعضی وقتها(در واقع خیلی اتفاق می افته برای من)که یک برنامه رو اجرا می کنید بعد از چند دقیقه می بینید که یک کاری پیش می یاد که مجبورید برید ومعلوم نیست که کار این برنامه چقدر طول می کشه و نمی تونید که با ساعت تنظیم کرد که کامپیوتر خاموش بشه یا مواردی دیگر ! به طور کلی وقتی که معلوم نیست که کار یک برنامه کی تموم می شه من برای حل این مسئله اومدم این اسکریپت رو نوشتم
www.negarsoft.persiangig.ir/afterfinish2اینطوری استفاده می شه
./afterfinish2 pogrammenameبرای خاموش کردن به طور پیش فرض نیاز به  دسترسی هست که به همین خاطر ازتون پسورد می خواد (این پسورد جایی ذخیره نمی شه) و توجه کنید که پسورد یک بار ازتون پرسیده می شه و نمایش هم نمی ده ! پس دقت کنید منتها می تونید به طرق دیگر پسورد رو به برنامه داد
نکته: این برنامه فقط برنامه هایی که با حساب کاربری شما اجرا شده باشد رو می تونه مانیتور کنه پس اگر که با sudo بخواهید اجراش کنید و بخواهید که برنامه ای که با حساب شما اجرا شده رو مانیتور کنه کار نمی کنه
به خاطر اینکه از خاموش شدن اتفاقی جلوگیری بشه قبلش اون برنامه رو سرچ می کنه که اگر اجرا بود مانیتور بشه و اگر اجرا نبود با چاپ پیامی! از برنامه خارج می شه
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین سهراب ابوالفتحی

  • Newbie
  • *
  • ارسال: 1
  • جنسیت : پسر
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #1 : 01 خرداد 1390، 11:55 ب‌ظ »
میشه لطف کنید خط به خط اسکریپت رو توضیح بدید

آفلاین Aref.Ariyapour

  • Full Member
  • *
  • ارسال: 203
  • جنسیت : پسر
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #2 : 02 خرداد 1390، 01:43 ق‌ظ »
آقا رضا عزیز یه سوال
ببینید به نظرتون این قسمت :
ps -u `whoami` |grep -i $1 >/dev/nullمشکل نداره. من این خط رو اجرا میکنم error میده. ببینید شما چیزی رو به فرمان grep ندادید  و بعد خواستید که standard output رو بریزید تو null.
کلا شما این طور عمل کردید که ببینید آیا برنامه ای واسه این کاربر باز هست یا نه ، اگر باز بود دوباره بررسی میکنه و زمانی که همه پروسس ها بسته شدن، سیستم رو خاموش میکنه.
آقا رضا تو این while که شما گفتید
while [ $exe != '1' ]منظورتون این بوده که تا زمانی که فرمان ps ... درست اجرا شده، و پروسه ای درحال اجرا هست، این حلقه ادامه پیدا کنه. درسته.
حالا بعضی وقت ها که یه دستور ناموفق میشه همیشه خروجیش ۱ نمیشه و ممکنه ۲ هم بشه. به نظر من بهتره که بنویسید:
while [ $exe =='0' ]
باز اگه در مورد اون خط :
ps -u `whoami` |grep $1 >/dev/nullتوضیح بدید ممنون میشم. تو سیستم من که error میداد.
در ضمن به نظر من واسه این کاری که شما گفتید، این طور مناسب نیستش که ببینیم همه پروسه های کاربر جاری تموم شده و بعد سیستم رو خاموش کنیم. شاید یه پروسس ای رو یه کاربر اجرا کرده که تا ابد تموم نمیشه. به نظر من این طور بهتر بود که نام برنامه از کاربر گرفته بشه، بعد ما بریم pid رو پیدا کنیم و بعد رو این pid مانور بدیم.
قربان شما
موفق باشید
« آخرین ویرایش: 02 خرداد 1390، 01:45 ق‌ظ توسط Aref.Ariyapour »
That's me in the corner
That's me in the spotlight, I'm
Losing my religion

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
پاسخ به: خاموش کردن بعد از اتمام کار یک برنام
« پاسخ #3 : 02 خرداد 1390، 04:44 ق‌ظ »
[code]سلام
خب لازم شد که فنی تر ! کد رو بررسی کنیم
قسمت  اول
[code]echo پسورد کاربری خود را وارد کنید |fribidi
read -s pass
echo اجرا شدم |fribidi
این قسمت که خب کار خاصی انجام نمی ده فقط یک متن فارسی رو  چاپ می کنه (چون خط فرمان قابلیت نمایش صحیح حروف فارسی رو نداره این خروجی رو با fribidi انجام می دهند) بعد پسورد رو از کاربر می گیره ودر متغیر pass ذخیره می کنه (-s باعثت می شه که چیزی رو که کاربر تایپ می کنه روی صفحه نمایش نشان داده نشه-بنا به دلایل امنیتی)
قسمت دوم
ps -u `whoami` |grep -i $1 >/dev/null
if [ $? != '0' ]
then
echo no programme running!...
exit
fi
خب این قسمت برای اینکه از خاموش شدن بی مورد جلوگیری کنه
نقل‌قول
ببینید به نظرتون این قسمت :
ps -u `whoami` |grep -i $1 >/dev/null
مشکل نداره. من این خط رو اجرا میکنم error میده. ببینید شما چیزی رو به فرمان grep ندادید  و بعد خواستید که standard output رو بریزید تو null.
کلا شما این طور عمل کردید که ببینید آیا برنامه ای واسه این کاربر باز هست یا نه ، اگر باز بود دوباره بررسی میکنه و زمانی که همه پروسس ها بسته شدن، سیستم رو خاموش میکن
اینکه شما خطا در یافت می کنید به احتمال زیاد مربوط به این می شه که این کد رو خارج از اسکریپت اجرا کردید چیزی رو که ما به grep می دیم همون چیزیه که کاربر به ما می ده ! به متغیر $1 در فرمان توجه کنید
اما توضیحش :
ps یک نرم افزاری که پروسس ها رو نشون می ده
whoamiنرم افزاریه که می گه شما (اجرا کننده )نام کاربریش چیه
``زوج علامت بالا به این معنیه که هر چیزی که بینشان باشه اجرا می شه و خروجیشون بجای این زوج علامت و عبارت درونشون قرار می گیره
ps -u `whoami`خب این می یاد تمام برنامه هایی رو که کاربری رو که اجراش کرده رو لیست می کنه
ps -u `whoami |grep -i $1 >/dev/nullاین خط می یاد تمام برنامه رو می فرسته (با | ) به grep -i  grep هم دنبال می گرده ببینه که همچین عبارتی توی لیست برنامه ها هست یا نه که خب اگر باشه به طور پیش فرض چاپش می کنه ولی چون صفحه شلوغ می شد فرستادمش به  نا کجا آباد !(/dev/null ) اگر که همچین چیزی وجود داشت متغیر ? (این متغیر خروجی رو که برنامه به صدا زنندش می فرسته توی c همون return ; هست )برابر صفر می شه و اگر که این عبارت نبود یا مشکلی پیش اومد (خیلی کم پیش می یاد که مشکلی رخ بدهد -یعنی من که تا حالا زیاد ندیدم) مخالف صفر میشه که بستگی به این چه حالتی باشه فرق می کنه
اما اون ساختار شرطی بررسی می کنه که ببینه آیا متغیر ? صفر هست یا نه ؟ (چون بلافاصله بعد از خط بالا قرار داره می شه مطمئن شد که وضعیت grep رو مشخص می کنه - چون بعد از اجرای هر دستور مقدارش تغییر می کنه) اگر که مخالف صفر بود یعنی این برنامه وجود نداره یا اینکه اشکالی وجود داره!که در این صورت از اسکریپت خارج می شه
قسمت سوم:
exe=0
while [ $exe != '1' ]
do
ps -u `whoami` |grep $1 >/dev/null
exe=$?
sleep 2
done
خط اول می یاد متغیر exeرو برابر صفر قرار می ده بعد میره توی حلقه ی while توی این حلقه ابتدا دستور قسمت دوم اجرا می شه بعد چون یک برنامه ی دیگه هم هست و مقدار $? تغییر می کنه اومدم مقدار exe رو برابر ? قرار دادم و مبنای مقایسه رو هم برپایه ی exe گذاشتم بعد از خط بالا ۲ثانیه صبر می کنه چون هم از میزان پردازش حلقه کم بشه و هم اینکه اگر داشت اسکریپتی رو مانیتور می کرد فرصت کافی برای رفتن به خط بعد باشه وهم اینکه سریع خاموش نشه ! و فرصت کنسل هم داشته باشه بعد از این دوثانیه دو باره حلقه از اول چک می شه
قسمت آخر t

[/code]echo $pass |sudo -S halt[/code]
حال اگر که grep چیزی پیدا نکرد یا مشکلی پیش اومد از حلقه خارج می شه و کامپیوتر رو خاموش می کنه
نقل‌قول
منظورتون این بوده که تا زمانی که فرمان ps ... درست اجرا شده، و پروسه ای درحال اجرا هست، این حلقه ادامه پیدا کنه. درسته.
حالا بعضی وقت ها که یه دستور ناموفق میشه همیشه خروجیش ۱ نمیشه و ممکنه ۲ هم بشه. به نظر من بهتره که بنویسید:
بله با صفر بهتره ولی نمی دونم چرا این مدلی نوشتم (این کد مال چند ماه پیشه)یعنی تغیییرش دادم به مخالف با یک ولی الان که فکر می کنم می بینم خیلی بهتره که با صفر مقایسه بشه ممنون
نقل‌قول
ر ضمن به نظر من واسه این کاری که شما گفتید، این طور مناسب نیستش که ببینیم همه پروسه های کاربر جاری تموم شده و بعد سیستم رو خاموش کنیم. شاید یه پروسس ای رو یه کاربر اجرا کرده که تا ابد تموم نمیشه. به نظر من این طور بهتر بود که نام برنامه از کاربر گرفته بشه، بعد ما بریم pid رو پیدا کنیم و بعد رو این pid مانور بدیم.
احتمالا یک جاییش رو متوجه نشدید قرار نیست که این صبر کنه تا همه ی برنامه تموم بشن (خیلی از برنامه ها هستند که تا زمانی که سیستم خاموش نشده در حال اجرا هستند )بلکه برای اپن برنامه ای رو که ما می دیم صبر می کنه اما ایده ی pid ایده ی خوبیه چون با استفاده از نام برنامه ها ممکنه که تداخل بوجود بیاد مثلا dd با thdd (هر چند که توی برنامه های با اسم بزرگتر کمتر پیش می یاد )ولی pid این مشکل رو نداره در عوض pid این مشکل رو داره (به همبن خاطر من اسم رو به pid ترجیح دادم-هر کسی با کامپیوترش یک جوری کار می کنه) که توی اسکریپتهایی که  توی خط فرمان نوشته میشه ویک برنامه چندین بار اجرا می شه و به اتمام می رسه pid فرق می کنه و با عث که یا یک بار اجرا خاموش بشه و به دفعات بعدی نرسه برای pid هم این خط رو به اول اضافه کنید
pid=`pidof $1`وخطوط شامل
ps -u `whoami`|grep -i $1 >/dev/nullبه ابن خط تبدیل کنید
ps -u `whoami` |awk '{print $1}' |grep $pid >/dev/null
« آخرین ویرایش: 02 خرداد 1390، 04:46 ق‌ظ توسط سید وحید رضا برهانی »
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین Aref.Ariyapour

  • Full Member
  • *
  • ارسال: 203
  • جنسیت : پسر
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #4 : 02 خرداد 1390، 08:48 ق‌ظ »
آقا رضا شرمنده، یه چیز تابلویی رو من متوجه نشده بودم، که الان درست دیدم، متوجه شدم. من اصلا حواسم نبود که این Script نام برنامه مورد نظر رو به عنوان argument میگیره. بعد اونجا که $1 رو به grep فرستادید من اشتباها فکر کردم که standard output رو به null فرستاده بودید که صفحه شلوغ نشه، در صورتی که $1 همون نام برنامه مورد نظر هستش که به grep فرستاده شده. پس یه تیکه از اون پستم که گفتم، Script وایمیسه تا همه برنامه ها تموم شن اشتباهه.(ببخشید بی دقتی شد  ](*,) :D)
در هر صورت رضا جان دستت درد نکنه.
موفق باشید
That's me in the corner
That's me in the spotlight, I'm
Losing my religion

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #5 : 02 خرداد 1390، 10:49 ق‌ظ »
خواهش می کنم
آدم با اشتباه کردن جیز بیشتری  یاد می گیره!
به امید مفید بودن
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین ssaeidd

  • Jr. Member
  • *
  • ارسال: 79
  • جنسیت : پسر
  • Im Persian , My land is Iran
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #6 : 02 خرداد 1390، 10:59 ق‌ظ »
چرا این همه خودتون رو اذیت میکنید . برنامه Gshutdown رو از center‌نصب کنید همین کارو میکنه
Allow me to introdius myself:
Im PERSIAN
My land is IRAN

آفلاین b_gholamali

  • Full Member
  • *
  • ارسال: 233
  • جنسیت : پسر
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #7 : 02 خرداد 1390، 11:40 ق‌ظ »
چرا این همه خودتون رو اذیت میکنید . برنامه Gshutdown رو از center‌نصب کنید همین کارو میکنه
و البته sentinella هم هست که خیلی کامله
اما بهرحال استفاده از اسکریپت سید یه حال دیگه‌ای داره  ;)
به جای تاج گل بزرگی که پس از مرگم برای تابوتم می آوری، شاخه ای از آن را همين امروز به من هديه کن...

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #8 : 02 خرداد 1390، 02:39 ب‌ظ »
چرا این همه خودتون رو اذیت میکنید . برنامه Gshutdown رو از center‌نصب کنید همین کارو میکنه
سوال جالبی بود !
اولش که من نمی دونستم برای همچین کاری نرم افزار هم هست! ولی به طور کلی اینکه آدم بتونه یک کار رو خودش انجام بده چندتا مزیت داره : ۱- مهمترینش اینکه آ دم در این حین کلی چیز یاد می گیره و یکجوری تمرین هست برای اسکریپت نویسی و برنامه نویسی ویه طور کلی اینکه یه کامپیوتر نشون بدی رئیس کیه؟! ۲- دومین مزیت اینکه آدم می دونه چجوری کار می کنه (جدا از مسئله اعتماد-که در اینجا مطرح نیست) باعث می شه که اگر لازم شد به بهترین شکل ممکن برای خودم ویرایش کنم ویا با سایر چیزهای دیگه ترکیبش کنم ۳-مهمترین مزیتش اینکه آدم وقتی یک چیزی (جدا از کوچکی یا بزرگی)درست می کنه (یا سرهم می کنه) کلی ذوق می کنه ! و انرژی مثبت و این حرفها
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین کیان

  • High Hero Member
  • *
  • ارسال: 2338
  • جنسیت : پسر
من برای حل این مسئله اومدم این اسکریپت رو نوشتم
www.negarsoft.persiangig.ir/afterfinish2
لینک خرابه!

آفلاین tazekar

  • Full Member
  • *
  • ارسال: 148
  • جنسیت : پسر
  • آی نفس کش!
پاسخ : خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #10 : 29 دی 1391، 10:32 ب‌ظ »
من پست های تاپیک رو نخوندم و نمیدونم جریان چیه (خوابم میاد میخوام برم بخوابم :o) این شاید به درد بخوره:
first && secondبه جای first دستور اولی و به جای second دستور دوم که میخواهید اجرا بشه رو قرار بدید. دستور اول رو اجرا میکنه و تا وقتی که اون دستور تموم بشه یا پنجره اش بسته بشه صبر میکنه و بعد دستور دوم رو اجرا میکنه. میشه دستورات بیشتری هم بهش اضافه کرد.

نکته: اگر به جای && از & استفاده کنید تمام دستورات هم زمان اجرا خواهند شد
ای بابا!

آفلاین Iman17

  • Sr. Member
  • *
  • ارسال: 439
  • جنسیت : پسر
پاسخ : خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #11 : 23 اردیبهشت 1392، 09:24 ق‌ظ »
لینک دانلود اسکریپت خراب شده.
لطفا تصحیح کنید.
Fedora 20 - 64 bit - Xfce 4.10

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
پاسخ : خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #12 : 23 اردیبهشت 1392، 10:09 ق‌ظ »
سلام
http://negarsoft.persiangig.com/afterfinish2خوشحالم که هنوزم کسی هست که بخواهد امتحانش کنه
مثل همیشه به امید مفید بودن و نه به تضمین آن .
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین MrAli

  • Sr. Member
  • *
  • ارسال: 304
  • جنسیت : پسر
    • وبلاگ علی حسین‌زاده
پاسخ : پاسخ به: خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #13 : 23 اردیبهشت 1392، 10:35 ق‌ظ »
چرا این همه خودتون رو اذیت میکنید . برنامه Gshutdown رو از center‌نصب کنید همین کارو میکنه
و البته sentinella هم هست که خیلی کامله
اما بهرحال استفاده از اسکریپت سید یه حال دیگه‌ای داره  ;)
یعنی Gshutdown و sentinella رو میشه تنظیم کرد که با پایان یک برنامه خاص سیستم رو خاموش کنن؟ من الان از qshutdown استفاده می کنم که خیلی عالیه اما فقط قابلیت های زمانی رو داره و نمیشه بهش گفت بعد از پایان x سیستم رو خاموش/ریستارت/خواب کن.
.:علی آقا:.
وبلاگ من: https://alihzadeh.blog.ir

آفلاین Iman17

  • Sr. Member
  • *
  • ارسال: 439
  • جنسیت : پسر
پاسخ : خاموش کردن بعد از اتمام کار یک برنامه
« پاسخ #14 : 28 اردیبهشت 1392، 10:03 ب‌ظ »
سلام
http://negarsoft.persiangig.com/afterfinish2خوشحالم که هنوزم کسی هست که بخواهد امتحانش کنه
مثل همیشه به امید مفید بودن و نه به تضمین آن .
اولا سپاس بابت لینک
من کاری که کردم این بود که متنی که توی لینک بود رو توی یه فایل .sh ریختم و تا حدی هم درست کار می کنه.
یعنی بعد از این که نرم افزار بسته میشه سیستمم میره روی حالت خاموش شدن ولی روی لوگوی فدورا (من فدورا دارم :دی) گیر می کنه و خاموش نمیشه. جالب بود esc هم زدم که فرایند هایی که بسته شدن رو ببینم ولی کلا لپتاپ هنگ میکنه و مجبور شدم به فشار فیزیکی روی بیارم.
مشکل کجاست؟
« آخرین ویرایش: 29 اردیبهشت 1392، 08:51 ب‌ظ توسط Iman17 »
Fedora 20 - 64 bit - Xfce 4.10