شما هنوز به سیستم وارد نشده اید.

#1 2016-06-16 18:02:55

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

استفاده از systemd/Timers به جای Cron

قبلا از خواندن لطفا توجه بفرمایید:
تایمر فایل ها = Timer files
سرویس فایل ها = Service files
تارگت فایلها = Target files
------------------------------------------------------------------------------------------------------------------------
فکر می کنم نیاز به توضیح اضافه ای نباشه درمورد اینکه cron چی هست و چه کاربردی داره چون همه ی دوستان به این مساله واقف هستند. پس بی مقدمه میریم سر اصل مطلب. توی این آموزش تصمیم داریم از systemd/Timers به جای cron استفاده کنیم. برای این هدف ما به چند فایل نیازمند هستیم که دو تا از این فایل ها تایمر فایل ها و سرویس فایل ها هستند.
تایمر فایل ها:
این فایل ها در اقع همان کار زمانبندی را انجام می دهند و با پسوند timer. نمایش داده می شوند و وظیفه ی کنترل سرویس فایل ها رو به عهده دارند. این فایل ها از دو نوع شیوه ی زمان دهی پشتیبانی میکنند. یکی realtime که زمان تقویمی هست و با تاریخ تقویم فعال میشوند و یکی Monotonic که فعال شدن تایمر رو به یک نقطه ی زمانی وابسته می کنند(بعدا با یک مثال متوجه خواهیم شد).تایمر فایل ها معمولا از دوبخش [Unit] و [Timer] تشکیل شده اند. که زمان دهی در قسمت [Timer] انجام میشود.ساختار تایمرفایل ها شبیه ساختار زیر است

[Unit]
Description=Something about file or action
 
[Timer]
OnCalendar=date or time
OnBootSec=time after boot

[Install]
WantedBy=multi-uer.target

تایمر فایل ها به طور خودکار از وابستگی های پیش فرض بهره می برند مگر اینکه در ساختار آنها در بخش [Unit] برای =DeafaultDependencies مقدار false در نظر گرفته شود. مثلا زمان خاموشی سیستم برای متوقف شدن کامل و درست از shutdown.target پیروی میکنند.(درمورد تارگت ها بعدا یه توضیح میدم  wink)
اما برای زمان دهی به تایمر فایل ها دو گزینه پیش روی ما بود یا فعالیت تایمر بر اساس تاریخ تقویم یا تخصیص نقطه ای برای فعال شدن. برای تخصیص زمان تقویمی باید از آپشن OnCalendar در بخش [Unit] استفاده کنیم. مثلا فلان تایمر دوشنبه ها ساعت ۱۲:۰۰:۰۰ استارت بشه. تاریخ ها را به شکل های متفاوتی می توانیم تعریف کنیم که چند نمونه از آن ذکر شده ولی قبل از ذکر نمونه باید با شکل کلی آن آشنا شویم:

OnCalendar=*-*-* *:*:*

سه * اول مربوط به تاریخ روز و ماه و سال و سه * بعد مربوط به ساعت دقیقه و ثانیه. مثلا:

OnCalendar=2016-06-16 23:45:30

اما این امکان وجود داره که ما تایمر رو به شکل دوره ای فعال کنیم مثلا روزانه، هفتگی، ماهیانه، سالیانه که در این صورت برای راحتی استفاده از این گزینه ها امکان پذیر است:

minutely, hourly, daily, monthly, weekly, yearly

تصمیم داریم که تایمری را هر ۱۵ دقیقه یکبار فعال کنیم:

OnCalendar=*:0/15

شکل های دیگر:

Sat,Thu,Mon-Wed,Sat-Sun → Mon-Thu,Sat,Sun *-*-* 00:00:00
     Mon,Sun 12-*-* 2,1:23 → Mon,Sun 2012-*-* 01,02:23:00
                   Wed *-1 → Wed *-*-01 00:00:00
           Wed-Wed,Wed *-1 → Wed *-*-01 00:00:00
                Wed, 17:48 → Wed *-*-* 17:48:00
Wed-Sat,Tue 12-10-15 1:2:3 → Tue-Sat 2012-10-15 01:02:03
               *-*-7 0:0:0 → *-*-07 00:00:00
                     10-15 → *-10-15 00:00:00
       monday *-12-* 17:00 → Mon *-12-* 17:00:00
 Mon,Fri *-*-3,1,2 *:30:45 → Mon,Fri *-*-01,02,03 *:30:45
      12,14,13,12:20,10,30 → *-*-* 12,13,14:10,20,30:00
 mon,fri *-1/2-1,3 *:30:45 → Mon,Fri *-01/2-01,03 *:30:45
            03-05 08:05:40 → *-03-05 08:05:40
                  08:05:40 → *-*-* 08:05:40
                     05:40 → *-*-* 05:40:00
    Sat,Sun 12-05 08:05:40 → Sat,Sun *-12-05 08:05:40
          Sat,Sun 08:05:40 → Sat,Sun *-*-* 08:05:40
          2003-03-05 05:40 → 2003-03-05 05:40:00
05:40:23.4200004/3.1700005 → 05:40:23.420000/3.170001
      2003-03-05 05:40 UTC → 2003-03-05 05:40:00 UTC
                2003-03-05 → 2003-03-05 00:00:00
                     03-05 → *-03-05 00:00:00
                    hourly → *-*-* *:00:00
                     daily → *-*-* 00:00:00
                 daily UTC → *-*-* 00:00:00 UTC
                   monthly → *-*-01 00:00:00
                    weekly → Mon *-*-* 00:00:00
                    yearly → *-01-01 00:00:00
                  annually → *-01-01 00:00:00
                     *:2/3 → *-*-* *:02/3:00

اما در مورد شکل دوم زمان دهی به تایمر. در این شکل ما با آپشن های

OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec=

سر و کار داریم.
=OnActiveSec فعالیت را به زمانی که خود تایمر فعال شده است وابسته می کند. مثلا یک سرویس یک دقیقه بعد از فعال شدن تایمر فعال شود.
=OnBootSec وابسته به زمانی که سیستم بوت میشود.
=OnStartupSec زمانی که سیستم استارت میشود.
=OnUnitActiveSec تایمری را تعریف میکند که به زمانی که تایمر آخرین بار فعال بوده است وابسته می کند.(زمان آغاز آخرین فعالیت تایمر)
=OnUnitInactiveSec تایمری را تعریف میکند که به زمانی که تایمر آخرین بار غیر فعال شده است وابسته می کند (زمان پایان آخرین فعالیت تایمر)
برای مثال می خواهیم تایمری تعریف کنیم که یک دقیقه بعد از بوت شدن فعال شود و هر ده دقیقه بعد از شروع آخرین فعالیت دوباره فعال شود:

[Unit]
Descrition=active every 10 miniutes

[Timer]
OnBootSec=1min
OnUnitActiveSec=10min

و به این شکل تایمر ما هر ده دقیقه اجرا میشود.

اما این ها همه برای ساختن تایمر فایل بود. در اقع ما برای اجرای یک سرویس، تایمری را پیکربندی می کنیم. پس باید یک سرویس در کنار تایمر ما تعریف شود. این سرویس نیز مثل تایمر فایل ها ساختاری دارند.ساختار سرویس فایل ها هم به شکل زیر است:

[Unit]
Description=Something about service

[Service]
ExecStart=Command or Path to script
Type=simple

داخل این ساختار جای پیچیده و گنگی نیست. دستوری که قرار است اجرا شود باید در جلوی =ExecStart قرار بگیرد یا  مسیری که اسکریپت در آنجا قرار گرفته است.
مقدار Type هم simple باشد تا سرویس ما قابلیت فعال شدن دوباره را داشته باشد. مقادیری مانند oneshot، notify و ... هم وجود دارد که هر کدام برای یک سری از اهداف کاربرد دارد. مثلا oneshot موجب میشود که سرویس یک بار اجرا شود و دیگر اجرا نشود.

نکته: برای هر تایمر فایل یک سرویس فایل همنام خودش وجود دارد. مثلا Example.timer و Example.service و اگر در تایمر فایل تعیین نشود که کدام سرویس فعال شود، سعی میکند که سرویسی همنام خودش را اجرا کند.

مسیر هر دوی تایمر فایل ها و سرویس ها یکسان است. برای توزیع من (آرچ) این مسیر است:

/etc/systemd/system/

یک مثال واقعیتر:

#!/bin/bash
`echo $(date) >> "/home/farid/Desktop/date"`

این محتوای اسکریپتی است با نام Test.sh که در دسکتاپ قرار گرفته و خروجی آن تاریخ فعلی است که در فایل date روی دسکتاپ ذخیره میشود.
اکنون ما باید دو فایل timer. و service. را ساخته و پیکربندی کنیم.
sudo vim /etc/systemd/system/Test.service

[Unite]
Description=My first service

[Service]
Type=simple
ExecStart=/home/farid/Desktop/Test.sh

sudo vim /etc/systemd/system/Test.timer

[Unit]
Description=My first timer

[Timer]
OnCalendar=*:0/15
Unite=Test.service

[Install]
WantedBy=multi-user.target

بعد از ساختن فایل ها کافیست که تایمر و سرویس را enable کنیم.

sudo systemctl enable Test.service
sudo systemctl enable Test.timer
sudo systemctl start Test.timer

اما target. فایل ها چیستند؟ فرض کنیم می خواهیم در یک زمان یکسان درواقع با یک تایمرفایل چند سرویس را اجرا کنیم. برای این منظور نیاز به تارگت فایل ها داریم که با پسوند target. نمایش داده میشوند. ساختار تارگت فایل ها هم شبیه زیر است:

[Unit]
Description=Something about what your heart want

البته در بخش [Unit] این فایل ها می توان تنظیمات بسیار پیشرفته تری نیز اعمال کرد. تارگت فایل ها وظیفه ی گروه بندی سرویس ها را دارند.
و در همان مسیر تایمر فایل ها و سرویس فایل ها ساخته و قرار داده میشوند. در مثال قبل فرض میکنیم که ما علاوه بر Test.service سرویس دیگری با نام Test2.service داریم و این دو سرویس باید همزمان بر اساس تایمر فایل اجرا شوند. پس کافیست تارگت فایل را بسازیم و در انتهای سرویس فایل هایمان مقدار زیر را وارد کنیم (اگر نام تارگت فایل ما Test.target باشد):

[Install]
WantedBy=Test.target

Test.service content

[Unite]
Description=My first service

[Service]
Type=simple
ExecStart=/home/farid/Desktop/Test.sh

[Install]
WantedBy=Test.target

سپس مقدار Unit در Test.timer را به Test.target تغییر بدهیم.

Test.timer content

[Unit]
Description=My first timer

[Timer]
OnCalendar=*:0/15
Unite=Test.target

[Install]
WantedBy=multi-user.target

باید بعد از هر تغییر در سرویس ها یا تایمر قبل از استارت کردن یا enable کردن آنها دستور زیر را اجرا کنیم:

sudo systemctl daemon-reload

کافیست که سرویس ها و تایمر را دوباره راه اندازی و enable کنیم.

نکته: برای ایجاد دقت در شمارنده ی تایمر و سیستم می توانیم از =AccuracySec در تایمر در بخش [Timer] استفاده کنیم. بهتر است مقدار را برابر با 1us قرار دهیم.

AccuracySec=1us

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

آفلاین

#2 2016-06-16 18:04:55

Arcush
Moderator
ثبت شده: 2015-09-15
ارسال ها: 1,282

پاسخ: استفاده از systemd/Timers به جای Cron

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

آفلاین

#3 2016-06-16 18:12:32

morealaz
عضو
از : کرمان
ثبت شده: 2016-03-19
ارسال ها: 292

پاسخ: استفاده از systemd/Timers به جای Cron

آقا خیلی عالیه دم شما گرم

آفلاین

#4 2016-06-16 18:15:41

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: استفاده از systemd/Timers به جای Cron

Arcush نوشته است که:

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

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

آفلاین

#5 2016-06-16 18:16:48

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: استفاده از systemd/Timers به جای Cron

morealaz نوشته است که:

آقا خیلی عالیه دم شما گرم

ممنونم از لطف شما دوست عزیز smile

آفلاین

#6 2016-06-18 00:24:03

silver
عضو
از : اصفهان
ثبت شده: 2015-12-03
ارسال ها: 187
وب سایت

پاسخ: استفاده از systemd/Timers به جای Cron

عالی بود. ممنون.


بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ (1).اقُلْ هُوَ اللَّهُ أَحَدٌ(2). اللَّهُ الصَّمَدُ (3).لمْ يَلِدْ وَلَمْ يُولَدْ(4). وَلَمْ يَكُن لَّهُ كُفُوًا أَحَدٌ(5)
http://lidora.blog.ir
علیرضا پژوهش

آفلاین

#7 2016-06-18 04:05:01

حسین حیدری
عضو
از : اصفهان
ثبت شده: 2015-09-16
ارسال ها: 367
وب سایت

پاسخ: استفاده از systemd/Timers به جای Cron

نمیدونم چرا من کلا هنوز نیازی به کرون و systemd/timer توی زندگیم نداشتم اما در کل عالی بود big_smile


وبسایت شخصی من: http://hosseinws.ir

آفلاین

#8 2016-06-18 19:38:07

farid
عضو
از : شیراز
ثبت شده: 2016-05-27
ارسال ها: 48

پاسخ: استفاده از systemd/Timers به جای Cron

ممنونم از همه ی دوستان. دارم تلاش میکنم که اگه بشه کاملترش کنم. smile

آفلاین

پانوشت انجمن

پشتیبانی توسط تیم آرچ لینوکس ایران و نیرو گرفته با FluxBB