وبلاگ ایجاد محدودیت زمانی برای یک فرمان در لینوکس میخواهیم فرمانی به نام foo را در یک مدت زمانی خاص اجرا کنیم؛ به گونهای که پس از این مدت زمان، این فرمان متوقف شود. چگونه میتوان برای یک فرمان در لینوکس محدودیت زمانی ایجاد کرد؟ چگونه یک فرمان لینوکس اجرا کنیم و پس از N ثانیه، به صورت خودکار آن را متوقف کنیم؟
1398/11/045057 بازدید
وبلاگ ایجاد محدودیت زمانی برای یک فرمان در لینوکس
میخواهیم فرمانی به نام foo را در یک مدت زمانی خاص اجرا کنیم؛ به گونهای که پس از این مدت زمان، این فرمان متوقف شود. چگونه میتوان برای یک فرمان در لینوکس محدودیت زمانی ایجاد کرد؟ چگونه یک فرمان لینوکس اجرا کنیم و پس از N ثانیه، به صورت خودکار آن را متوقف کنیم؟
خوشبختانه در لینوکس امکان تعریف محدودیت زمانی وجود دارد. میتوان یک فرمان با محدودیت زمانی در لینوکس اجرا کرد. در این مطلب میخواهیم نحوه شروع یک فرمان و خاتمه آن در یک زمان مشخص را توضیح دهیم. به عبارت دیگر، ایجاد یک محدودیت زمانی برای یک فرمان در لینوکس یا یونیکس را به شما نشان خواهیم داد.
چگونه یک فرمان را در لینوکس با محدودیت زمانی اجرا کنیم؟
هدف ما در اینجا اجرای فرمانی با عنوان “ping www.ariasercive.net” با محدودیت زمانی ۳۰ ثانیه است؛
۱) باز کردن برنامه ترمینال
۲) اجرای فرمان ping و توقف آن پس از گذشت ۳۰ ثانیه:
php
1timeout 30s ping www.ariasercive.net
۳) در همین حال، میتوان فرمان sleep و دیگر فرمانهای shell را نیز در آن ترکیب کرد:
php
1ping www.ariasercive.net & sleep 30s; kill $!
حالا بیایید تمام فرمانها و مثالها را با جزئیات بررسی کنیم.
فرمان محدودیت زمانی در لینوکس
قالب کار برای فرمان timeout به صورت زیر است:
با استفاده از گزینههای –k یا --kill-after=DURATION میتوانید برای فرمان در لینوکس محدودیت زمانی ایجاد کنید. به عنوان نمونه، مشخص کنید که اگر بعد از یک مدت زمانی خاص، فرمان هنوز هم در حال اجرا بود، سیگنال kill ارسال شود.
گزینه --preserve-status این امکان را فراهم میکند که فرمان timeout با همان وضعیت نهایی فرمان به انتها برسد.
php
1timeout --preserve-status 10s command1
گزینه –foreground وقتی مستقیماً از یک پرامپت shell اجرا نشده باشد، این امکان را فراهم میکند که فرمان از TTY خوانده شود و سیگنالهای TTY را دریافت کند. در این حالت، زیرمجموعهها یا اصطلاحاً فرزندان فرمان دارای محدودیت زمانی نخواهند بود.
php
1timeout --foreground 1m command223## Login to remote server. Run htop and die after 30seconds ##45timeout --foreground 30s ssh -t vivek@server1.cyberciti.biz htop67timeout --foreground 20s ssh -t vivek@centos7 top
راهحل bash
قالب کار با کمک فرمانهای read و kill نسبتاً ساده است:
متغیر $! شامل شناسه فرآیندی است که آخرین بار در پسزمینه اجرا شده است. در این مثال، این مورد به فرمان ping مربوط میشود.
یادداشتی بر فرمان تکخطی perl برای یونیکس، مک و بیاسدی
وقتی برنامههای بالا را نداشتید و یا علاقهای به استفاده از آنها نداشتید، میتوانید ترکیب فرمانهای perl و shell را امتحان کنید. میتوانید از فرمان تکخطی perl برای تنظیم یک هشدار استفاده کنید و سپس در یک محدودیت زمانی خاص، برنامه خود را اجرا نمایید. در هر صورت، باید نحوه کار برنامهتان را با SIGALRM تشخیص دهید. برنامههایی که دارای بروزرسانیهای دورهای هستند، معمولاً از ALRM برای این منظور استفاده میکنند و به جای اینکه متوقف شوند، با دریافت این سیگنال آپدیت میشوند.
php
1## define doalarm() shell ##23doalarm() { perl -e 'alarm shift; exec @ARGV' -- "$@"; }45 67## timeout vim command after 600 seconds ##89doalarm 600 vim /path/to/demo.py1011 1213## timeout ping command after 10 seconds ##1415doalarm 10 ping nixcraft.com
جمعبندی
فرمان timeout یک روش ساده برای ایجاد محدودیت زمان برای یک فرمان در لینوکس است. در همین حال، استفاده از فرمان تکخطی perl در هنگام کار با یونیکس، مک و بیاسدی و زمانی که فرمانهای timeout و bash در دسترس نیستند، میتواند مفید باشد. میتوانید با تایپ فرمان man به صورت زیر، صفحه timeout man را نیز برای کسب اطلاعات بیشتر ببینید.