‎16.3‎- فرمان‌های زمان / تاریخ

زمان/تاریخ و زمان‌سنجی

date

فرمان date به سادگی احضار شده، تاریخ و زمان را در stdout نمایش می‌دهد. جاییکه این فرمان جالب می‌شود در گزینه‌های تجزیه و قالب‌بندی‌ آن است.

مثال ‎16-10‎. کاربرد date

#!/bin/bash
#  به کارگیری فرمان ‎date‎

echo "The number of days since the year's beginning is `date +%j`."
#   برای فراخوانی قالب‌بندی به یک ‎+‎ پیشوند احتیاج دارد.
#                           ‎%j‎ روز سال را ارایه می‌کند.

echo "The number of seconds elapsed since 01/01/1970 is `date +%s`."
#    ‎%s‎ تعداد ثانیه‌های سپری شده از شروع «‎UNIX epoch‎» را
#+   ارایه می‌کند،اما این چگونه مورد استفاده واقع می‌شود؟

prefix=temp
suffix=$(date +%s)    # گزینه ‎+%s‎ با ‎date مختص GNU است.
filename=$prefix.$suffix
echo "Temporary filename = $filename"
#جهت ایجاد نام‌فایل‌های موقتی «انحصاری و تصادفی» عالی است
#+                      حتی بهتر از به کار بردن ‎$$‎ است.

#برای گزینه‌های بیشتر قالب‌بندی، صفحه man فرمان ‎date‎ را بخوانید.

exit 0

گزینه ‎-u‎ زمان هماهنگ شده جهانی UTC ‏(Universal Coordinated Time) را ارایه می‌کند.

bash$ date
Fri Mar 29 21:07:39 MST 2002

bash$ date -u
Sat Mar 30 04:07:42 UTC 2002

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

مثال ‎16-11‎. محاسبات date

#!/bin/bash
# date-calc.sh
#  مولف: ‎Nathan Coulter‎
#  با مجوز در راهنمای ‎ABS‎ استفاده شده (تشکر!).

MPHR=60    # دقیقه‌های هر ساعت
HPD=24     #   ساعت‌های هر روز

diff () {
        printf '%s' $(( $(date -u -d"$TARGET" +%s) -
                        $(date -u -d"$CURRENT" +%s)))
           #     ‎%d =‎ روز ماه
}


CURRENT=$(date -u -d '2007-09-01 17:30:24' '+%F %T.%N %Z')
 TARGET=$(date -u -d '2007-12-25 12:30:00' '+%F %T.%N %Z')
# ‎%F =‎ تاریخ کامل، ‎%T = %H:%M:%S‎، ‎%N =‎ نانوثانیه‌ها، ‎%Z =‎ منطقه ساعتی

printf '\nIn 2007, %s ' \
       "$(date -d"$CURRENT +
        $(( $(diff) /$MPHR /$MPHR /$HPD / 2 )) days" '+%d %B')" 
#       ‎%B =‎ نام ماه                      ‎^‎ نیمه راه
printf 'was halfway between %s ' "$(date -d"$CURRENT" '+%d %B')"
printf 'and %s\n' "$(date -d"$TARGET" '+%d %B')"

printf '\nOn %s at %s, there were\n' \
        $(date -u -d"$CURRENT" +%F) $(date -u -d"$CURRENT" +%T)
DAYS=$(( $(diff) / $MPHR / $MPHR / $HPD ))
CURRENT=$(date -u -d"$CURRENT +$DAYS days" '+%F %T.%N %Z')
HOURS=$(( $(diff) / $MPHR / $MPHR ))
CURRENT=$(date -u -d"$CURRENT +$HOURS hours" '+%F %T.%N %Z')
MINUTES=$(( $(diff) / $MPHR ))
CURRENT=$(date -u -d"$CURRENT +$MINUTES minutes" '+%F %T.%N %Z')
printf '%s days, %s hours, ' "$DAYS" "$HOURS"
printf '%s minutes, and %s seconds ' "$MINUTES" "$(diff)"
printf 'until Christmas Dinner!\n\n'

#                         :تمرین
#                        --------
# تابع ‎diff ()‎ را طوری بازنویسی کنید که به جای استفاده
#    از متغیرهای عمومی، پارامترهای صادر شده را بپذیرد.

فرمان date دارای گزینه‌های خروجی بسیاری است. برای مثال ‎%N‎ بخش نانوثانیه‌های زمان فعلی را ارایه می‌کند. یک مورد استفاده جالب این گزینه، در تولید اعداد صحیح تصادفی است.

date +%N | sed -e 's/000$//' -e 's/^0//'
#          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# .زدودن صفرهای ابتدا و انتها در صورت موجودبودن
# طول عدد صحیح تولید شده وابسته به آن است که چه
#+                   .تعداد صفر حذف گردیده باشد

# 115281032
# 63408725
# 394504284

گزینه‌های بسیار بیشتری وجود دارد (‎man date‎ را امتحان کنید).

date +%j
#    .روز سال (تعداد روزهای سپری شده از اول ژانویه) را بازتاب می‌دهد

date +%k%M
#   .ساعت و دقیقه ۲۴ساعتی را به صورت یک رشته رقمی واحد بازتاب می‌دهد



# پارامتر ‎TZ‎ ارجحیت بر منطقه ساعتی پیش‌فرض ‎(time zone)‎ را میسر می‌کند.
date                      #            Mon Mar 28 21:42:16 MST 2005
TZ=EST date               #            Mon Mar 28 23:42:16 EST 2005
#           با تشکر از ‎Frank Kannemann‎ و ‎Pete Sjoberg‎ برای این نکته.


SixDaysAgo=$(date --date='6 days ago')
OneMonthAgo=$(date --date='1 month ago')  
OneYearAgo=$(date --date='1 year ago')

همچنین مثال ‎3-4‎ و مثال ‎ A-43‎ را مشاهده نمایید.

zdump

‎Time zone dump‎: زمان را در یک منطقه ساعتی مشخص شده بازتاب می‌دهد.

bash$ zdump EST
EST  Tue Sep 18 22:09:22 2001 EST

time

آمار زمان‌سنجی تفصیلی برای اجرای یک فرمان را بیرون می‌دهد.

‎time ls -l /‎ چیزی مشابه این را ارایه می‌دهد:


real    0m0.067s
user    0m0.004s
sys     0m0.005s

همچنین فرمان بسیار مشابه times در بخش قبلی را ملاحظه کنید.

از زمان نگارش ‎2.0‎ در ‎Bash‎، که time یک کلمه رزرو شده پوسته گردیده، رفتار آن در یک لوله اندکی تغییر یافته است.


touch

برنامه سودمندی برای به روزرسانی زمان ویرایش-دستیابی یک فایل به زمان جاری سیستم یا یک زمان تعیین شده، اما همچنین برای ایجاد یک فایل جدید نیز مفید است. فرمان touch zzz، بر فرض آن که zzz از قبل موجود نباشد، فایل جدیدی به طول صفر، به نام zzz ایجاد می‌کند. نشانه‌گذاری زمان فایل‌های خالی به این روش، برای ذخیره کردن اطلاعات تاریخ مفید است، برای مثال در پیگردی زمان‌های تغییر و تبدیل روی یک پروژه.


فرمان touch معادل با ‎: >> newfile‎ یا ‎>> newfile‎ (برای فایل‌های معمولی) است.


tip

قبل از انجام یک ‎cp -u‎ (کپی/به روزرسانی)، از touch برای به روزرسانی نشانه زمان فایل‌هایی که نمی‌خواهید رونویسی گردند استفاده کنید.

به عنوان یک نمونه، اگر دایرکتوری با نام ‎/home/bozo/tax_audit‎ شامل فایل‌هایی با نام‌های ‎spreadsheet-051606.data‎‏، ‎spreadsheet-051706.data‎، و ‎spreadsheet-051806.data‎ باشد، آنوقت انجام یک ‎touch spreadsheet*.data‎ این فایل‌ها را از رونویسی شده به وسیله فایل‌هایی با همین نام‌ها در جریان اجرای فرمان زیر محافظت می‌کند.

‎cp -u /home/bozo/financial_info/spreadsheet*data  /home/bozo/tax_audit‎


at

at یک فرمان کنترل job است که مجموعه تعیین شده‌ای از فرمان‌ها را در یک زمان مشخص شده اجرا می‌کند. به طور ظاهری، به cron شباهت دارد، اما at بویژه برای اجرای یک مجموعه فرمان در یک نوبت مفید است.

at 2pm January 15 برای دریافت مجموعه فرمان‌هایی که در آن زمان باید اجرا شوند اعلام آمادگی می‌کند. این فرمان‌ها باید سازگار با اسکریپت پوسته باشند، چون در اصل، کاربر در هر نوبت یک سطر از یک اسکریپت اجرا شونده را تایپ می‌کند. ورودی با یک ‎Ctl-D‎ خاتمه می‌یابد.

با استفاده از گزینه ‎-f‎ یا تغییر مسیر ورودی ‎(<)، فرمان at لیستی از فرمان‌ها را از یک فایل می‌خواند. این فایل یک اسکریپت پوسته قابل اجرا است، البته، به هر حال، باید غیر محاوره‌ای باشد. بویژه ضمیمه کردن یک فرمان run-parts در فایل برای اجرای مجموعه گوناگونی از اسکریپت‌ها، زبردستانه است.

bash$ at 2:30 am Friday < at-jobs.list
job 2 at 2000-10-27 02:30

batch

batch یک فرمان کنترل job مشابه با at است، اما یک لیست فرمان را موقعی اجرا می‌کند که بارگذاری سیستم به پایین ‎.8‎ افت می‌کند. مانند at، این نیز با گزینه ‎-f‎ می‌تواند فرمان‌ها را از یک فایل بخواند.


cal

یک تقویم ماهانه را به طور مرتب و آراسته در stdout چاپ می‌کند. اگر بخواهید، تقویم سال جاری یا محدوده‌ بزرگی از سال‌های گذشته و آینده را چاپ می‌کند.

sleep

این معادل پوسته برای یک wait loop است. برای یک تعداد ثانیه تعیین شده توقف می‌کند، هیچ کاری انجام نمی‌دهد. می‌تواند برای زمان‌سنجی یا در پردازش‌های درحال اجرای پس‌زمینه، کنترل گهگاهی یک رویداد (نمونه‌برداری)، همچون در مثال ‎32-6‎، مفید باشد.

sleep 3     # سه ثانیه متوقف می‌شود


پیش‌فرض فرمان sleep ثانیه است، اما دقیقه، ساعت، و روز نیز می‌تواند تعیین گردد.
sleep 3 h   # !سه ساعت متوقف می‌شود


برای اجرای فرمان‌ها در فواصل زمانی، ممکن است فرمان watch نسبت به sleep انتخاب بهتری باشد.


usleep

Microsleep (حرف u می‌تواند به صورت یونانی mu، یا پیشوند micro- خوانده شود). این درست مانند sleep در بالا است، اما در وقفه‌های میکروثانیه‌ای توقف می‌کند. می‌تواند در زمان‌سنجی ریزبینانه، یا برای نمونه‌برداری از پیشرفت یک پردازش در فاصله‌های بسیار نزدیک بهم به کار برود.

usleep 30     # .میکروثانیه توقف می‌کند ‎30‎

این فرمان قسمتی از بسته ‎initscripts / rc-scripts‎ در Red Hat است.

Caution

فرمان usleep بویژه زمان‌بندی دقیقی فراهم نمی‌کند، و از اینرو برای حلقه‌های زمان‌بندی حساس مناسب نیست.


hwclock‏، clock

فرمان hwclock‏ ساعت سخت‌افزاری سیستم را دستیابی یا میزان می‌کند. استفاده از برخی گزینه‌های آن نیازمند مزایای root است. هنگام بالا آمدن سیستم، فایل راه‌اندازی سیستم ‎/etc/rc.d/rc.sysinit‎ برای تنظیم وقت سیستم از روی ساعت سخت‌افزاری، فرمان hwclock را به کار می‌برد.

فرمان clock مترادفی برای hwclock‏ است.