فروردین ۱۴ ۱۳۹۷

تسکی که به خیر گذشت.

توی شرکت به این نتیجه رسیده بودیم که یه تعداد از فایل‌هایی که روی سرور داریم اضافی هست و باید کلاً پاک بشن. من که می‌گم یه تعداد شما خودتون یه تعداد خیلی بالا رو در نظر بگیرید. برای این کار از طرف یه تیم دیگه لیست فایل‌هایی که برامون مهم هستن و باید بمونن رو بهم ارسال کرده بودن (لیست A) و من باید همه‌ی فایل‌های غیر از اونها رو از روی استوریج پاک می‌کردم.

سناریوی خیلی پیچیده‌ای نیست کافیه من لیست فا‌یل‌های موجود رو تهیه کنم (لیست B)، فایل‌هایی از لیست ‌B که داخل لیست A هستن رو حذف کنم و لیست C رو بسازم و دونه دونه‌ی فایل‌های موجود توی لیست C رو حذف کنم. 🙂 خب من هم همین کار رو کردم. طبیعتاً این کار رو دستی انجام نمی‌دم و انتخاب اوّلم برای انجامش اسکریپت Bash بود. یه حلقه‌ی while که خطوط لیست B رو دونه دونه می‌خوند و توی لیست A دنبال اون می‌گشت اگر پیداش نمی‌کرد اون رو به یه فایل دیگه تحت عنوان فایل‌های لیست C اضافه می‌کرد.

از اونجایی که آدم خیلی محتاطی هستم و عملاً امکان تهیه‌ی نسخه‌ی پشتیبان نداشتم (حجم و تعداد فایل‌ها این اجازه رو به ما نمی‌داد!) حداقل‌ها رو برای کاهش خطا انجام دادم. در مرحله‌ی اوّل تعداد فایل لیست‌ها رو با یه جمع و تفریق ساده بررسی کردم چون اصولاً باید

(تعداد فایل‌های لیست B) – (تعداد فایل‌های لیست A) = (تعداد فایل‌ها لیست C)

حداقل دوّم این بود که چند تا از فایل‌های توی لیست C رو به صورت رندم توی لیست A چک کنم تا مبادا (احتمال خیلی خیلی پایین) اسکریپت اشتباه کرده باشه.

من در مرحله‌ی جمع و تفریق به مشکل خوردم. این معادله برقرار نبود!!!! تعداد اختلاف خیلی خیلی بالا بود. اسکریپت به خوبی و بدون خطا داشت اجرا می‌شد، بدون خطا تموم می‌شد ولی خروجی اون چیزی نبود که باید باشه. چیزای مختلفی رو چک کردم. کنار لیست C یه لیست دیگه به اسم D ساختم تا شروط به شکل if … else بررسی بشن و دقیقاً عملکرد اسکریپت رو ببینم ولی نتیجه تفاوتی نداشت. انواع لاگ‌ها رو فعال کردم ولی چیزی عایدم نشد. اسکریپت بدون خطا تموم می‌شد ولی جمع و تفریق اختلاف خیلی خیلی زیادی با مقادیر مورد انتظار داشت. در نهایت به صورت تصادفی متوجه شدم اسکپریت داخل لیست B از یه خطی جلوتر نمی‌ره و فقط ۱۵۰هزار تا (البته حدوداً چون مقدار واقعی یه خورده کمتر بود!) فایل رو چک می‌کنه!! هنوز نمی‌دونم مشکل چی بوده ولی خیلی مسخره بود. پس این اسکریپت رو بی‌خیال شدم و رفتم سراغ پایتون. خیلی بهتر از Bash عمل کرد و کار رو یک سره کرد برام.

بعد از اینکه دوتا حداقل احتیاطی رو رد کردم لیست واقعی فایل‌هایی که باید حذف می‌شدن جلوی روم بود. اقدام احتیاطی سوّم این بود که به جای حذف فایل‌ها اونها رو به یه دایرکتوری دیگه منتقل کنم و مثلاً چند روز منتظر بمونم اگر داد کسی در نیومد در نهایت یه جا پاکشون کنم ولی حجم فایل‌ها، تعداد فایل‌ها، ددلاین و فشار‌های کاری دیگه این اجازه رو بهم ندادن و مجبورم کردن مستقیم وارد پرسه‌ی حذف بشم و تا تموم شدن اون و حتی تا چند روز بعد از اون استرسش تحمل کنم. الان که دیگه همه چیز به خوبی و خوشی تموم شده به این نتیجه رسیدم اگر بار دیگه همچین تسکی داشته باشم و حتی اگر حجم و تعداد فایل‌ها اجازه‌ی تهیه‌ی پشیبان رو ندن به این صورت عمل کنم که همه‌ی فایل‌ها رو به شکل کاملاً ترتیبی تغییر نام بدم تا اگر فایلی به اشتباه داخل این لیست بود بتونم به راحتی ریکاورش کنم (البته به شرطی که اون «فشار‌های کاری دیگه» که بالا گفتم وجود نداشته باشن.)

چون آدم فراموشکاری هستم اینها رو نوشتم تا اون «دفعه‌ی بعد» بدونم چه تصمیماتی داشتم. شما چه ایده‌/تجربه‌ای دارید؟


اسفند ۲۱ ۱۳۹۶

بررسی بودن یا نبودن فایل یا پوشه در شل اسکریپت

bash

در برخی اوقات ممکن است بخواهید وجود یک فایل یا پوشه را از طریق خط فرمان و یا شل اسکریپت بررسی کنید.برای اینکار می توان از دستور if به همراه اپراتورهای مربوطه این کار را انجام داد.

به عنوان نمونه می خواهیم بررسی کنیم که آیا فایل etc/hosts/ وجود دارد یا نه،برای اینکار می توان دستور پایین را اجرا کرد :

 

[ -f /etc/hosts ] && echo “Found” || echo “Not found”

 

در صورتی که فایل وجود داشته باشد Found نمایش داده خواهد شد و در عیر اینصورت Not found نمایش داده خواهد شد.

همین کار را نیز می توان به روش پایین و به صورت یک شل اسکریپت هم انجام داد :

 

#!/bin/bash
file=”/etc/hosts”
if [ -f “$file” ]
then
echo “$file found.”
else
echo “$file not found.”
fi

 

اپراتورهایی که می توان استفاده کرد به صورت زیر می باشند :

-b FILE
FILE exists and is block special

-c FILE
FILE exists and is character special

-d FILE
FILE exists and is a directory

-e FILE
FILE exists

-f FILE
FILE exists and is a regular file

-g FILE
FILE exists and is set-group-ID

-G FILE
FILE exists and is owned by the effective group ID

-h FILE
FILE exists and is a symbolic link (same as -L)

-k FILE
FILE exists and has its sticky bit set

-L FILE
FILE exists and is a symbolic link (same as -h)

-O FILE
FILE exists and is owned by the effective user ID

-p FILE
FILE exists and is a named pipe

-r FILE
FILE exists and read permission is granted

-s FILE
FILE exists and has a size greater than zero

-S FILE
FILE exists and is a socket

-t FD file descriptor FD is opened on a terminal

-u FILE
FILE exists and its set-user-ID bit is set

-w FILE
FILE exists and write permission is granted

-x FILE
FILE exists and execute (or search) permission is granted

 

بنابراین به صورت کلی می توان از این ساختار دستوری استفاده کرد :

 

 

if [ operator FileName ]
then
echo “FileName – Found, take some action here”
else
echo “FileName – Not found, take some action here”
fi

 

چنانچه قصد داشته باشید دستور شما فقط در یک خط نوشته شود می توان از نمونه ی پایین استفاده کنید :

 

file1=”/etc/hosts” ; if [ -f “$file1” ] ; then echo “$file1 found.” ; else echo “$file1 not found.” ; fi

 

امید است تا از این مطلب استفاده ی لازم را برده باشید.


بهمن ۲۳ ۱۳۹۶

آموزش تنظیم Hostname در خط فرمان

change-hostname

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

جهت نمایش hostname می توانید از دستورهای پایین استفاده کنید :

 

# hostname
# hostname -s
# hostname -f

  • سوئیچ s- نام کوتاه کامپیوتر را نمایش می دهید.(فقط hostname)
  • سوئیچ f- کامپیوتر FQDN در شبکه را نمایش می دهد.(فقط زمانی که کامپیوتر جزئی از یک domain یا realm باشد و FQDN ان تنظیم شده باشد.)

 

روش دیگر برای نمایش نام میزبان cat کردن فایل hostname می باشد :

 

# cat /etc/hostname

اکنون جهت تغییر hostname و با تنظیم آن می توانید از دستور پایین استفاده کنید :

 

 

# hostnamectl set-hostname your-new-hostname

نکته اینکه بجای your-new-hostname باید نام مورد نطر خود را بنویسید.اکنون جهت نمایش hostname می توانید از دستوراتی که در بالا گفته شد استفاده کنید یا اینکه از دستور پایین استفاده کنید :

 

 

#hostnamectl

روش دیگر برای تنظیم hostname ماشین، ویرایش فایل hostname می باشد :

 

 

# vi /etc/hostname

یکی دیگر از روش ها جهت نمایش و ویرایش hostname استفاده از sysctl می باشد.جهت نمایش hostname نیز می توانید از این دستور استفاده کنید :

 

 

# sysctl kernel.hostname

جهت تغییر hostname می توانید از این دستور استفاده کنید :

 

 

# sysctl kernel.hostname=new-hostname

 

نکته اینکه این تغییر به صورت موقت می باشد.جهت اعمال تغییر به صورت دائمی این دستور را استفاده کنید :

 

 

# sysctl -w kernel.hostname=new-hostname

 

یکی دیگر از روشهای نمایش و پیکربندی hostname استفاده از دستور nmtui می باشد :

 

#nmtui

پس از اجرای دستور بالا یک برنامه ای تقریبا گرافیکی در خط فرمان اجرا خواهد شد که یکی از امکانات آن ویرایش hostname می باشد.یا اینکه اگر تمایل دارید با استفاده از nmtui به صورت مستقیم فقط hostname را تغییر دهید کافیست تا از این روش استفاده کنید :

 

 

# nmtui-hostname your-new-hostname

اکنون جهت نمایش hostname می توانید از دستوراتی که گفته شد استفاده کنید.

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

 


دی ۱۸ ۱۳۹۶

آموزش کامنت کردن چند خط در شل اسکریپت

bash

شاید برای شما هم پیش آمده باشد که بخواهید درون shell script خود چند خط را comment کنید.مثلا در زبان برنامه نویسی c++/c برای کامنت کردن چند خط، در ابتدای خط مورد نظر */ قرار می دهند و در پایان خط مورد نظر از /* استفاده می کنند.یک نمونه از کد را در پایین مشاهده می کنید :

 

 

/*
my c code
comment # 2
blah
foo bar
….
*/

 

اما راه حل برای شل اسکریپت چیست؟

برای کامنت کردن خط در شل اسکریپت در ابتدای خط مورد نظر علامت # قرار داده می شود.به عنوان نمونه :

 

# my comment goes here

برای کامنت کردن چند خط نیز می توانید به صورت زیر عمل کنید :

 

# my comment 1
# my comment 2
# my comment N

 

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

 

#!/bin/bash
echo “Say Something”
<<COMMENT1
your comment 1
comment 2
blah
COMMENT1
echo “Do something else”

 

 

 

 

همانطور که در مثال بالا مشاهده می کنید، دستورات بین  COMMENT1>> تا COMMENT1 به صورت کامنت می باشند.

 

روش دیگر برای کامنت کردن چند خط در شل اسکریپت به صورت زیر می باشد :

 

#!/bin/bash
foo=bar
: ‘
This is a test comment
Author foo bar
Released under GNU

echo “Init…”
# rest of script

 

 

 

 

 

همانطور که در مثال بالا می بینید دستوراتی که بین ‘  : و  ‘ می باشند به صورت کامنت می باشند.در واقع ساختار کلی آن به این صورت می باشد :

 

 

: ‘
your comments here

 

امید است تا از این مطلب استفاده لازم را برده باشید.