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

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

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


ارائه ۲۴٫۱۰ اوبونتو منتشر شد 🎉

نویسنده موضوع: دستور شرطی واسه آریا2 حل شد!  (دفعات بازدید: 4140 بار)

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

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
دستور شرطی واسه آریا2 حل شد!
« : 22 دی 1393، 01:38 ق‌ظ »
سلام دوستان. با یک سوال چالشی دیگه در خدمت شما هستم  ;D
همون طور که میدونین من از آریا2 واسه دانلود استفاده می کنم.
دستورات رو توی کرون تنظیم می کنم واسه دانلود شبانه.
اینم لیست کلی دستور کرون:
15 01 * * * aria2c -c -j1 -x16 -s16 -k 1M -d /home/kubuntu/Downloads -i /home/kubuntu/Desktop/Link.txt -l downloadlog --log-level=notice > logdownloadaria2c && echo "my password" | sudo -S shutdown -h now
30 06 * * * pkill aria2c
35 06 * * * echo "my password" | sudo -S shutdown -h now

دیگه خودتون بهتر میدونین واسه چی اینجوری تنظیم کردم  ;)

خب حالا سوالم:
لینک های دانلود رو توی فایل تکست میذارم. اون لینک هایی هم که نخوام بگیرم # میذارم.
خب حالا. فرض کنین توی فایل تکست، چیزی واسه دانلود نباشه. خب طبق زمان بندی کرون وقتی چیزی نباشه دستور آریا2 رو تموم می کنه میره واسه شات داون (مثل امشب که یهو وسط وبگردی سیستم خاموش شد!! کف کردم!)

میخوام بدونم چه دستوری میشه قبل از آریا2 داد که اول چک کنه ببینه لینکی یا متنی (غیر از # ها) توی اون فایل txtاگه هست دانلود رو شروع کنه و اگه نیست کلا اون سطر کد رو (هم آریا هم دستور شات داون) نگیره و من اینجوری وسط کار کف نکنم؟؟  :D

مرسی خیلی ممنون مچکر  ;)
« آخرین ویرایش: 04 بهمن 1393، 12:35 ق‌ظ توسط Rasubuntu »
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #1 : 22 دی 1393، 02:38 ق‌ظ »
یکی از دوستان گیکم، دوتا ایده ی خیلی خوب داد. که اگه این سوال جوابی نداشته باشه، با اون دوتا ایده به جواب برسه.
اینجا نقل قول میکنم:

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

نقل‌قول
یا اینکه دستور دوم رو (شات دان) تحت هیچ شرایطی زودتر از فلان ساعت اجرا نکن

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

چون این دو ایده سریع تر به جواب میرسه به نظرم  ;)

در هر صورت اگه کسی ایده ای، جوابی چیزی به ذهنش میرسه مارو هم در کشف های خفنش شریک کنه  ;)
« آخرین ویرایش: 22 دی 1393، 02:41 ق‌ظ توسط Rasubuntu »
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : دستور شرطی واسه آریا2
« پاسخ #2 : 22 دی 1393، 02:41 ق‌ظ »
دو تا راه به نظرم میرسه...

- یک اسکریپت کوچیک بنویسی به جای shutdown اون رو اجرا کنی، این اسکریپت لیست دانلودهات رو چک میکنه و مطابق اون تصمیم میگیره.
- یک دیالوگ قبل از shutdown باز کنی مثلا ۲۰ ثانیه فرصت بده که جلوی shutdown رو بگیری.
..I feel no fault for the fault I feel..

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #3 : 22 دی 1393، 02:45 ق‌ظ »
دو تا راه به نظرم میرسه...

- یک اسکریپت کوچیک بنویسی به جای shutdown اون رو اجرا کنی، این اسکریپت لیست دانلودهات رو چک میکنه و مطابق اون تصمیم میگیره.
- یک دیالوگ قبل از shutdown باز کنی مثلا ۲۰ ثانیه فرصت بده که جلوی shutdown رو بگیری.

مرسی میلاد جان.
ایده ی اول که خب دانشم در حد اسکریپت نویسی نیست. شرمنده  ;)
ولی ایده ی دوم به نظرم بهتر باشه.یعنی به صورت یه صفحه ی پاپ آپ؟ که کاربر خودش دستی اونو بتونه کنسل کنه. درسته؟ 
چجوری میشه دیالوگ تنظیم کرد واسه شات داون؟
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : دستور شرطی واسه آریا2
« پاسخ #4 : 22 دی 1393، 03:01 ق‌ظ »
پس از مدتها چند خط Python نوشتیم ;D
dl/. آدرس لیست دانلودت هست، اگر چیزی توش پیدا نکنه سیستم رو off میکنه،‌خطوطی رو که با # شروع میشند هم در نظر نمیگیره،‌با دسترسی ریشه اجراش کن.
import os

flag = 0
f = open('./dl', 'r')
for line in f:
        if line[0] != '#':
                flag = 1
                break
if flag == 0:
        os.system("shutdown -h now")

برا دیالوگ هم باید اسکریپت نوشت، یک چیز شبیه این:
import Tkinter
import tkMessageBox
import os

top = Tkinter.Tk()
def cancel():
        exit()
b1 = Tkinter.Button(top, text = "Cancel", command = cancel)
b1.pack()
top.after(20000, lambda: top.destroy())
top.mainloop()
os.system("shutdown -h now")

من تسلطی تو ایجاد GUI تو Python ندارم و با یکم جستجو نوشتمش، برا همین خیلی ساده هست. ۲۰ ثانیه صبر میکنه اگر Cancel نکردی Shutdown میکنه.
میشه این دو رو با هم ترکیب کرد که اگر پای سیستم بودی و لینکی هم برا دانلود وجود نداشت باز ازت سوال بپرسه و بتونی پروسه shutdown رو لغو کنی.
« آخرین ویرایش: 22 دی 1393، 03:57 ق‌ظ توسط M!lad »
..I feel no fault for the fault I feel..

آفلاین doomhammer65ir

  • High Hero Member
  • *
  • ارسال: 1572
  • جنسیت : پسر
    • IRAN Backup
پاسخ : دستور شرطی واسه آریا2
« پاسخ #5 : 22 دی 1393، 11:22 ق‌ظ »
برای دیالوگ ها از این بهره ببرید:
http://en.wikipedia.org/wiki/Zenity

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #6 : 22 دی 1393، 12:37 ب‌ظ »
پس از مدتها چند خط Python نوشتیم ;D
dl/. آدرس لیست دانلودت هست، اگر چیزی توش پیدا نکنه سیستم رو off میکنه،‌خطوطی رو که با # شروع میشند هم در نظر نمیگیره،‌با دسترسی ریشه اجراش کن.
import os

flag = 0
f = open('./dl', 'r')
for line in f:
        if line[0] != '#':
                flag = 1
                break
if flag == 0:
        os.system("shutdown -h now")

مرسی از وقتی که گذاشتی. ولی این کد عکس هدف من عمل می کنه.
کد میگه اگه چیزی واسه دانلود نبود خاموش بشه سیستم. خب کرون هم که همین جوریه. اگه دانلودی نباشه میره واسه اجرای دستور شات داون
من میخوام اگه چیزی واسه دانلود نبود، خاموش نشه سیستم  ;)

نقل‌قول
برا دیالوگ هم باید اسکریپت نوشت، یک چیز شبیه این:
کد: [انتخاب]

import Tkinter
import tkMessageBox
import os

top = Tkinter.Tk()
def cancel():
        exit()
b1 = Tkinter.Button(top, text = "Cancel", command = cancel)
b1.pack()
top.after(20000, lambda: top.destroy())
top.mainloop()
os.system("shutdown -h now")


من تسلطی تو ایجاد GUI تو Python ندارم و با یکم جستجو نوشتمش، برا همین خیلی ساده هست. ۲۰ ثانیه صبر میکنه اگر Cancel نکردی Shutdown میکنه.
میشه این دو رو با هم ترکیب کرد که اگر پای سیستم بودی و لینکی هم برا دانلود وجود نداشت باز ازت سوال بپرسه و بتونی پروسه shutdown رو لغو کنی.
این به جواب سوالم نزدیک تره.
چون مثلا 20 ثانیه باعث میشه وقتی ساعت 1:15 پای سیستم نشستم و دارم کارام انجام میدم و موقع اجرای کرون تب در ساعت 1:15 می بینه دانلودی نیست و میره واسه شات داون، اون موقع بهم 20 ثانیه وقت میده که یا قبول کنم یا نکنم.
یا اگه داشت دانلود می کرد و من خواب بودم. بازم 20 ثانیه (چون زمان زیادی نیست و خوبه) صبر می کنه بعد خاموشش می کنه.
خیلی ممنون بابت وقتی که گذاشتی  ;)
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : دستور شرطی واسه آریا2
« پاسخ #7 : 22 دی 1393، 01:49 ب‌ظ »
یک تغییر کوچیک تو اسکریپت اولی:

import os
f = open('./dl', 'r')
for line in f:
        if line[0] != '#':
                os.system("shutdown -h now")
« آخرین ویرایش: 22 دی 1393، 01:57 ب‌ظ توسط M!lad »
..I feel no fault for the fault I feel..

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #8 : 22 دی 1393، 01:54 ب‌ظ »
یک تغییر کوچیک تو اسکریپت اولی:

import os
f = open('./dl', 'r')
for line in f:
        if line[0] != '#':
                os.system("shutdown -h now")

واقعا؟؟ چه خوب!
خب اونوخ یه سوال خنده دار (واسه منی که هنوز برنامه نویسی بلد نیستم)  ;D
این دستور رو باید دقیقا کجا بذارم؟
باید ازش خروجی اسکریپت بگیرم؟
باید توی ترمینال بزنم و اوکی کنم؟
باید بعد از دستور
15 01 * * * aria2c -c -j1 -x16 -s16 -k 1M -d /home/kubuntu/Downloads -i /home/kubuntu/Desktop/Link.txt -l downloadlog --log-level=notice > logdownloadaria2c &&کد رو بنویسم؟
یا کد رو جایی ذخیره کنم و اونجا دستور به اجرای اون کد بدم؟
چجوریه؟
من تا حالا نه اسکریپت نوشتم، نه اسکریپت لود کردم

فقط شده بعضی اوقات یه دستور رو مثلا اینجوری لود کردم
با رفتن به دایرکتوری و زدن
./ sh (مثلا)
« آخرین ویرایش: 22 دی 1393، 02:02 ب‌ظ توسط Rasubuntu »
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : دستور شرطی واسه آریا2
« پاسخ #9 : 22 دی 1393، 02:31 ب‌ظ »
اینجوری باید کار کنه، اونجا که نوشتم aria2c دستور aria2 مورد نظر خودت رو بزار، دانلود که تموم شد، میاد نگاه میکنه اگر لینکی برای دانلود تو لیست دانلودهات بود سیستم رو خاموش میکنه. اگر لینکی تو لیست نبود یا با # شروع می‌شدن هم که کاری نمیکنه.
import os

os.system("aria2c ...")

f = open('./dl', 'r')
for line in f:
        if line[0] != '#':
                os.system("shutdown -h now")

برا اجراش هم تو کرون باید بزنی:
echo "password" | sudo python ./address/script.py
درنتیجه اون دستور aria2c‌ کرون دیگه لازم نیست و بجاش از اجرای این اسکریپت استفاده میکنی.
« آخرین ویرایش: 22 دی 1393، 02:45 ب‌ظ توسط M!lad »
..I feel no fault for the fault I feel..

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #10 : 22 دی 1393، 02:40 ب‌ظ »
خیلی ممنون. واقعا دستتون درد نکنه.  ;)
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #11 : 22 دی 1393، 02:45 ب‌ظ »
یعنی فایل پایتون اینجوری میشه در کل؟

import os

os.system("aria2c -c -j1 -x16 -s16 -k 1M -d /home/kubuntu/Downloads -i /home/kubuntu/Desktop/Link.txt -l downloadlog --log-level=notice > logdownloadaria2c")

f = open('./home/kubuntu/Desktop/Link.txt', 'r')
for line in f:
        if line[0] != '#':
                os.system("shutdown -h now")
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #12 : 22 دی 1393، 03:11 ب‌ظ »
اون ./ ها باعث شدن فایل اررور بده.
اونارو پاک کردم. اینجوری شد

import os

os.system("aria2c -c -j1 -x16 -s16 -k 1M -d /home/kubuntu/Downloads -i /home/kubuntu/Desktop/Link.txt -l downloadlog --log-level=notice > logdownloadaria2c")

f = open('/home/kubuntu/Desktop/Link.txt', 'r')
for line in f:
        if line[0] != '#':
                os.system("shutdown -h now")

بعد ذخیره ش کردم توی دایرکتوری هوم:
/home/kubuntu/Aria2c.python.py

بعد هم توی کرون تب دادم دستور رو:

58 14 * * * echo "my password" | sudo -S python /home/kubuntu/Aria2c.python.py > logpy.txt
پس این دستور به کلی قانونش اینه که:
نگاه می کنه ببینه آیا لینکی توی فایل txt هست یا نه. اگه باشه خب دانلود می کنه و بعد از دانلود خاموش
اگه هم نباشه دیگه کاری انجام نمیده تا زمانی که دستورات بعدی کرون (مثلا سطر های بعد که زمان مشخص دیگه ای دارن) اجرا بشن.

درسته؟

خب یه سوال؟
نمیشه جوری دستور داد که ما اون دوتا دستور آریا2 و شات داون رو توی کرون داشته باشیم، ولی با پایتون اسکریپتی بنویسیم که مثلا اگه لینکی توی فایل تکست بود، اون سطر کرون رو اجرا کنه. یعنی آریا2 و شات داون رو اجرا کنه. و اگه لینکی نبود اون سطر رو اجرا نکنه.
یعنی
15 01 * * * aria2c -c -j1 -x16 -s16 -k 1M -d /home/kubuntu/Downloads -i /home/kubuntu/Desktop/Link.txt -l downloadlog --log-level=notice > logdownloadaria2c && echo "my password" | sudo -S shutdown -h nowاین سر جاش باشه. ولی قبل از دستور آریا2 یه دستور داده بشه که زمانی این سطر اجرا بشه توی کرون که لینکی در فایل تکست باشه.

میشه همچین چیزی اصن؟؟؟  ;)
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

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

  • High Hero Member
  • *
  • ارسال: 3504
  • جنسیت : پسر
  • علی (ع): زَكَاةُ الْعِلْمِ نَشْرُه
پاسخ : دستور شرطی واسه آریا2
« پاسخ #13 : 22 دی 1393، 03:23 ب‌ظ »
یه سوال دیگه؟
حالا فرض کنین این اسکریپت اجرا شد، (تست کردم و به خوبی اجرا شد. دمتون گرم)
خب وسط کار ممکنه نخوام دیگه دانلود کنم. چجوری میشه جلوی اسکریپت رو گرفت؟ دستورش واسه کنسل کردن اسکریپت چیه؟
نرم افزار، یک ابزاره. برای رسیدن به هدف ازش استفاده کنید. نرم افزار هدف شما نیست :) - آزادی، بزرگ‌ترین دروغ بشریت

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : دستور شرطی واسه آریا2
« پاسخ #14 : 22 دی 1393، 05:12 ب‌ظ »
درباره نقطه (./دات)، اشاره داره به همین دایرکتوری: dl/. یعنی همین دایرکتوری که اسکریپت از توش اجرا شده. پس اگر بخواید آدرس مستقل بدید نباید بزاریدش همونطور که خودتون متوجه شدید و حذفش کردید.

عملکرد اسکریپت هم به این صورت هست:
aria2 رو برای دانلود اجرا میکنه و دانلود ها انجام می‌شن،‌ بعد از اتمام دانلود میره مرحله بعدی. تو مرحله بعد لیست دانلود رو چک میکنه تا ببینه لینکی برا دانلود وجود داشته یا نه!‌ لینک هایی که با # شروع میشند هم در نظر نمیگیره. اگر لینکی نبود سیستم روشن می‌مونه و اگر هیچ لینکی نبود یا# داشتن سیستم رو خاموش میکنه.

من زیاد از Cron استفاده نمیکنم ولی منطقا Cron اجرای برنامه و... رو کنترل میکنه.
برا اینکه بشه یک پروسه که cron اجرا کرده رو متوقف کرد میشه لیست پروسه‌ها رو چک کنیم و id پروسه مدنظرمون رو پیدا و Kill کنمیش، مثل:

ps -e | grep 'aria2c'
یک خروجی مثل این داره:

2345 ?        00:00:00 aria2c
که میشه با kill -s 2345 یا pkill aria2c پروسه رو متوقف کرد.

من اسکریپت رو با بش هم نوشتم:
#!/bin/bash

cd ~/Downloads

aria2c -i ./dl -c

flag=0

while read line
do
if [ ${line:0:1} != "#" ]; then
    flag=1
fi
done < ./dl

if [ $flag == 0 ]; then
        exit
fi

(
for i in `seq 1 100`;
do
echo $i; sleep .2
done
) |

zenity --progress \
  --title="Shutdown..." \
  --text="Do you want to cancel the shutdown operation?" \
  --percentage=0 \
  --auto-close \
  --display=:0.0

if [ "$?" != 1 ] ; then
shutdown -h now
fi

مثل قبل، دانلود انجام میشه، لیست چک میشه،‌ اگر محتوی لینک بود سیستم میره برا خاموش شدن، ولی اینبار بهتون ۲۰ ثانیه اجازه میده پروسه رو کنسل کنید!

فرضا دارید با سیستم کار میکنید و دانلودهاتون تموم میشه و عملا سیستم باید خاموش بشه ولی بهتون اجازه میده عملیات رو کنسل کنید:

« آخرین ویرایش: 22 دی 1393، 05:58 ب‌ظ توسط M!lad »
..I feel no fault for the fault I feel..