کلا از وقتی با بش اسکریپت آشنا شدم به طور کل دارم یه جور دیگه با کامپیوتر کار میکنم 😀 یه بش ساده نوشتم که هیچ کار انجام نمیده جز اینکه رم و سی پی یو رو تا ته پر میکنه و خودم که بعد از اجرای این بش مجبور شدم سخت افزاری سیستمم رو ریاستارت کنم. برای نوشتن این بش اومدم به تعداد هستههای سی پی یو حلقه بینهایت درست کردم (البته میشه بیشتر هم حلقه درست کرد ولی حداقل تعداد حلقهها باید به تعداد هستههای سی پی یو باشه) و اسکریپت رو به شکلی تنظیم کردم که حلقهها رو به صورت موازی اجرا کنه و به این شکل هرکدوم از حلقهها روی یکی از هستههای سی پی یو انجام میشه و لود اون هسته رو به صد درصد میرسونه. اما برای رم کاری که کردم این بود که یه متغییر تعریف کردم و گفتم که تو هر بار اجرا شدن این حلقهها اون متغییر رو چندبار دوباره تو خودش بریزه. کد نهایی هم برای سیستم من که سی پی یوم دو هسته داره این شد:
z=q
while true; do
z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z
done &
while true; do
z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z
done
که این کد رو تو یه فایل با پسوند sh ذخیره کردم و با دستور
chmod +x file.sh
بهش قابلیت اجرایی دادم و با دستور
./file.sh
اجراش کردم و شاهد لود صد درصدی سی پی یو و رم بودم 😀 کد هم کلیاتش نکته خاصی نداره. اما در مورد خط
z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z
باید بگم که این خط وظیفه پر کردن رم رو داره. چون در ابتدای کد تو متغییر z فقط کاراکتر q رو قرار دادیم ولی به محض اینکه به حلقه میرسه ۲۲تا کاراکتر q توی متغییر z ذخیره میشن و تو بار دوم اجرا شدن حلقه ۴۸۴تا کاراکتر q توی متغییر z ذخیره و میشن و الی آخر. حالا این رو هم درنظر بگیرین که دوتا حلقه به صورت همزمان و چندصد بار در ثانیه دارن اجرا میشن! با این کار رم به سرعت پر میشه 🙂 تو آخر خط ۴ هم یک کاراکتر & قرار داره که باعث میشه دوتا حلقه به صورت موازی اجرا بشن و اگه اون کاراکتر & رو نذاریم فقط یک هسته سی پی یو لودش میره رو صد. اگه میخواین این کد رو رو روی سیستمی مثلا با سه هسته پردازش اجرا کنین (البته با مسئولیت خودتون!) باید خطهای دو و سه و چهار رو کپی کنید و آخر خط چهار پیست کنید تا سهتا حلقه به صورت موازی اجرا بشن و هر سه هسته لودشون بره رو صد.
z=q
while true; do
z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z
done &
while true; do
z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z
done &
while true; do
z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z
done
آپدیت:
برای اینکه مجبور نشین تو یه فایل جداگانه دستورات رو قرار بدین، میتونین دستورات رو توی یک خط بنویسین و مستقیم تو ترمینال وارد کنید تا سیستم بترکه. برای مثال رو سیستم من دستور به این شکل میشه:
z=q && while true; do z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z; done & while true; do z=$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z$z; done