11-Regex, Bash Scripting, Cron
11-Regex, Bash Scripting, Cron
LPI
Li
C1
nuxAdmi
nist
rat
or
Regex,Cr
on
BashScri
pti
ng
t
.me/
Behzad_
Abyar
i
ﺑﻪ ﻧﺎم ﺧﺪا
)Regex(Regular Experssion
در اﺻﻞ ﯾﮏ ﺳﺮي ﮐﺎراﮐﺘﺮ ﻫﺴﺘﻨﺪ ﮐﻪ ﺑﺎ ﻣﺤﺘﻮﯾﺎت ﻓﺎﯾﻞﻫﺎ ﮐﺎر ﻣﯽﮐﻨﻨﺪ .ﺑﺮ ﺧﻼف Wildcardsﮐﻪ ﺑﺎ اﺳﺎﻣﯽ ﻓﺎﯾﻞﻫﺎ ﮐﺎر ﻣﯽﮐﻨﻨﺪ.
^) :(Caretﻫﺮ زﻣﺎن ﻣﺪ ﻧﻈﺮ ﻣﺎ اﯾﻦ ﺑﺎﺷﺪ ﮐﻪ ﻣﺤﺘﻮﯾﺎت ﯾﮏ ﻓﺎﯾﻞ ﺑﺎ ﭼﻪ ﭼﯿﺰي ﺷﺮوع ﻣﯽﺷﻮد از اﯾﻦ ﮐﺎراﮐﺘﺮ اﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ.
:(Dollar Sign)$ﻫﺮ زﻣﺎن ﻣﺪ ﻧﻈﺮ ﻣﺎ اﯾﻦ ﺑﺎﺷﺪ ﮐﻪ ﻣﺤﺘﻮﯾﺎت ﯾﮏ ﻓﺎﯾﻞ ﺑﻪ ﭼﻪ ﭼﯿﺰي ﺧﺘﻢ ﻣﯽﺷﻮد از اﯾﻦ ﮐﺎراﮐﺘﺮ اﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ.
Page 1 of 12
>\<\) :(Word Boundariesاﯾﻦ ﮐﺎراﮐﺘﺮ ﻗﺴﻤﺘﯽ از ﻣﺤﺘﻮﯾﺎت ﯾﮏ ﻓﺎﯾﻞ ﮐﻪ دﻗﯿﻘ ًﺎ ﻣﺪ ﻧﻈﺮ ﻣﺎ اﺳﺖ را ﭘﯿﺪا ﻣﯽﮐﻨﺪ و ﻧﺸﺎن ﻣﯽدﻫﺪ .اﯾﻨﮑﻪ از اﺑﺘﺪا
ﺗﺎ اﻧﺘﻬﺎي ﻓﺎﯾﻞ ﺑﻪ دﻧﺒﺎل ﮐﻠﻤﻪ ﺟﺴﺘﺠﻮ ﮐﺮده و ﻧﺸﺎن ﻣﯽدﻫﺪ .اﻟﺒﺘﻪ ﻓﻘﻂ و ﻓﻘﻂ اﮔﺮ ﻫﻤﺎن ﮐﻠﻤﻪ ﺑﺎﺷﺪ را ﻧﺸﺎن ﻣﯽدﻫﺪ ﻧﻪ اﯾﻨﮑﻪ ﻗﺴﻤﺘﯽ از ﯾﮏ ﮐﻠﻤﻪ
دﯾﮕﺮ ﺑﺎﺷﺪ.
اﻣﺎ اﮔﺮ ﺑﺨﻮاﻫﯿﻢ ﺧﻄﻮﻃﯽ را ﺑﻪ ﻣﺎ ﻧﺸﺎن دﻫﺪ ﮐﻪ ﺑﺎ " ".ﺷﺮوع ﺷﺪه ﺑﺎﺷﺪ ﺑﺎﯾﺪ ﻗﺒﻞ آن \ ﺑﯿﺎورﯾﻢ و ﺑﻪ ﺻﻮرت زﯾﺮ ﻋﻤﻞ ﮐﻨﯿﻢ.
Page 2 of 12
] [ ) :(Bracketدرون ﺑﺮاﮐﺖ ﺑﺎزه ﺣﺮف را ﻣﺸﺨﺺ ﮐﺮده و ﺑﺎ ﺗﻌﺪاد ﺑﺮاﮐﺖ ﺣﺪاﻗﻞ را ﻣﺸﺨﺺ ﻣﯽﮐﻨﯿﻢ .در ﻣﺜﺎل زﯾﺮ ﺣﺪاﻗﻞ ﺳﻪ ﺣﺮف ﺑﺎ ﻣﺸﺨﺼﺎت
ﻣﻮرد ﻧﻈﺮ ﻣﺎ در ﻫﺮ ﮐﻠﻤﻪ وﺟﻮد دارد.
Page 3 of 12
Shell(Bash) Scripting
اﯾﻦ ﻣﺒﺤﺚ ﺑﻪ ﺗﻨﻬﺎﯾﯽ ﯾﮏ واﺣﺪ ﮐﺎﻣﻞ درﺳﯽ اﺳﺖ و در اﯾﻨﺠﺎ ﺗﻨﻬﺎ ﺑﻪ ﻣﻮارد ﭘﺎﯾﻪ و اوﻟﯿﻪ اﺷﺎره ﻣﯽﮐﻨﯿﻢ .در اﯾﻦ ﻣﺒﺤﺚ ﺗﻤﺎﻣﯽ Scriptﻫﺎﯾﯽ ﮐﻪ ﻗﺮار
اﺳﺖ ﮐﺎر ﮐﻨﯿﻢ ﺑﺎ Bashاﺟﺮا ﻣﯽﺷﻮد و ﺑﻪ ﻫﻤﯿﻦ ﺟﻬﺖ در اﺑﺘﺪاي Scriptﻋﺒﺎرت #! /bin/bashرا وارد ﻣﯽﮐﻨﯿﻢ ﮐﻪ در اﺻﻞ ﻧﺸﺎﻧﻪ اﯾﻦ اﺳﺖ ﮐﻪ
Script Compilerﻣﺎ Bashاﺳﺖ .اﻟﺒﺘﻪ اﮔﺮ ﻻزم ﺑﺎﺷﺪ در آﯾﻨﺪه در ﺣﻮﺿﻪ … ,DevOps, Administrationﮐﺎر ﮐﻨﯿﻢ ﮐﻢ و ﺑﯿﺶ ﺑﺮاي رﻓﻊ
ﯾﮏ ﺳﺮي از ﻣﻮاردي ﮐﻪ در ﻟﯿﻨﻮﮐﺲ ﻻزم دارﯾﻢ ﻧﯿﺎزﻣﻨﺪ Scriptﻧﻮﯾﺴﯽ و ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﻫﺴﺘﯿﻢ و ﺑﺴﺘﻪ ﺑﻪ ﺗﺠﺮﺑﻪ و داﻧﺶ ﺧﻮد ﻣﯽﺗﻮاﻧﯿﻢ از زﺑﺎنﻫﺎي
ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﻧﻈﯿﺮ Phyton,JAVA,C#و ...اﺳﺘﻔﺎده ﮐﻨﯿﻢ.
* ﻋﺒﺎرت ! #ﺑﺎ ﻧﺎمﻫﺎي shebang, hashbang, hashpling, pound bangدر ﮐﺘﺐ و ﻣﺤﯿﻂﻫﺎي ﮐﺎري اﺳﺘﻔﺎده ﻣﯽﺷﻮد.
در ﮔﺎم اول ﻣﯽﺧﻮاﻫﯿﻢ ﺑﺎ ifآﺷﻨﺎ ﺷﻮﯾﻢ ﮐﻪ در Scriptﻧﻮﯾﺴﯽ ﯾﮏ ﺷﺮط را ﺑﺮرﺳﯽ ﮐﺮده و در ﺻﻮرت اﺟﺮا ﺷﺪن و اﺟﺮا ﻧﺸﺪن آن ﻧﺘﺎﯾﺞ ﻣﺘﻔﺎوﺗﯽ را
ﺑﺮاي ﻣﺎ در ﺧﺮوﺟﯽ ﻧﺸﺎن ﻣﯽدﻫﺪ .ﺑﺪﯾﻦ ﻣﻨﻈﻮر ﯾﮏ ﻓﺎﯾﻞ اﯾﺠﺎد ﻣﯽﮐﻨﯿﻢ و ﭘﺴﻮﻧﺪ آن را shﻣﯽﮔﺬارﯾﻢ ﮐﻪ ﺑﻌﺪاً ﺑﺪاﻧﯿﻢ ﮐﻪ ﻓﺎﯾﻞ Scriptاﺳﺖ و داﺧﻞ
آن ﺑﺎ ifﯾﮏ Scriptﻣﯽﻧﻮﯾﺴﯿﻢ.
ﺧﻂ اول ﻫﻤﺎﻧﻄﻮر ﮐﻪ ﺗﻮﺿﯿﺢ دادﯾﻢ Compilerرا ﺗﻌﯿﯿﻦ ﻣﯽﮐﻨﺪ .در اداﻣﻪ ﺑﺎ ﻧﻮﺷﺘﻦ ifﺷﺮوع ﮐﺮده و ﻣﯽﮔﻮﯾﯿﻢ ﻫﻨﮕﺎﻣﯽ ﮐﻪ ﻋﺒﺎرت Linuxﺑﺎ ﻋﺒﺎرت
Linuxﺑﺮاﺑﺮ ﺑﻮد trueرا ﻧﺸﺎن ﺑﺪه و در ﻏﯿﺮ اﯾﻨﺼﻮرت falseرا ﻧﻤﺎﯾﺶ ﺑﺪه و در آﺧﺮ ﺑﺎ fiﺷﺮط را ﭘﺎﯾﺎن ﻣﯽدﻫﯿﻢ.
ﺣﺎل اﮔﺮ Scriptرا اﺟﺮا ﮐﻨﯿﻢ ﻣﯽﺑﯿﻨﯿﻢ ﮐﻪ ﻋﺒﺎرت trueﻧﻤﺎﯾﺶ داده ﻣﯽﺷﻮد .اﻣﺎ اﮔﺮ ﻋﺒﺎرت Linux=Linuxرا در Scriptﺗﻐﯿﯿﺮ دﻫﯿﻢ ﻧﺘﯿﺠﻪ
ﺧﺮوﺟﯽ falseﻣﯽﺷﻮد.
Page 4 of 12
در ﮔﺎم ﺑﻌﺪي ﻣﯽﺧﻮاﻫﯿﻢ ﯾﮏ Scriptﺑﻨﻮﯾﺴﯿﻢ ﮐﻪ از ﻣﺎ ﯾﮏ ورودي ﻋﺪد درﯾﺎﻓﺖ ﮐﺮده و اﮔﺮ اﯾﻦ ﻋﺪد 17و ﺑﺰرﮔﺘﺮ از آن ﺑﻮد ﻋﺒﺎرت VeryGood
اﮔﺮ ﺑﯿﻦ 10ﺗﺎ 16ﺑﻮد ﻋﺒﺎرت Goodو اﮔﺮ ﮐﻤﺘﺮ از 10ﺑﻮد ﻋﺒﺎرت Badرا ﻧﺸﺎن دﻫﺪ .ﺑﺮاي اﯾﻦ ﻣﻨﻈﻮر ﺑﺎﯾﺪ از ifﺑﻪ ﺻﻮرت ﺗﻮ در ﺗﻮ اﺳﺘﻔﺎده ﮐﻨﯿﻢ.
در ﺑﺎﻻ اﺑﺘﺪا ﯾﮏ ﻣﺘﻐﯿﯿﺮ ﺗﻌﺮﯾﻒ ﮐﺮده و اﺳﻢ آن را numﻣﯽﮔﺬارﯾﻢ ،ﺳﭙﺲ ﻣﺤﺘﻮﯾﺎت اﯾﻦ ﻣﺘﻐﯿﯿﺮ اﮔﺮ از 16ﺑﺰرﮔﺘﺮ ﺑﺎﺷﺪ ﯾﻌﻨﯽ 17و ﺑﺰرﮔﺘﺮ از 17
ﺑﺎﺷﺪ اوﻟﯿﻦ ﺷﺮط اﺗﻔﺎق ﻣﯽاﻓﺘﺪ .اﮔﺮ در اﯾﻦ ﺑﺎزه ﻧﺒﻮد ﺑﻪ ﺳﺮاغ ﺷﺮط ﺑﻌﺪي ﻣﯽرود ﮐﻪ در آﻧﺠﺎ ﮔﻔﺘﻪ اﺳﺖ ﮐﻪ اﮔﺮ ﻋﺪد ﺑﯿﻦ 10ﺗﺎ 16ﺑﺎﺷﺪ ﯾﻌﻨﯽ ﺧﻮد
10را ﻧﯿﺰ ﺷﺎﻣﻞ ﺷﻮد ﻟﺬا در ﺷﺮط ﺑﺰرﮔﺘﺮ از 9را ﻟﺤﺎظ ﻣﯽﮐﻨﯿﻢ .و در ﻧﻬﺎﯾﺖ اﮔﺮ دو ﻣﻮرد ﻗﺒﻞ ﻧﺒﺎﺷﺪ ﺑﻪ ﺳﺮاغ ﺷﺮط ﺳﻮم رﻓﺘﻪ و ﻋﺪد در ﺑﺎزه ﮐﻤﺘﺮ از
10ﮐﻪ در اﺻﻞ ﺧﻮد 10را ﺷﺎﻣﻞ ﻧﻤﯽﺷﻮد ﻗﺮار ﻣﯽﮔﯿﺮد .ﺑﺮاي ﻫﺮ ﮐﺪام از ﺑﺎزهﻫﺎ در ﺻﻮرت ﺑﺮﻗﺮاري ﺷﺮط ﯾﮏ ﭘﯿﻐﺎم ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﯾﺶ ﻧﺸﺎن داده
ﻣﯽﺷﻮد .ﻧﮑﺘﻪ دﯾﮕﺮ اﯾﻨﮑﻪ از $ﺑﻪ ﻋﻨﻮان ﻣﺤﺘﻮﯾﺎت ،از -gtﻣﺨﻔﻒ Greater Thanﺑﻪ ﻋﻨﻮان ﺑﺰرﮔﺘﺮ اﺳﺖ از ﻋﺪد ﻣﻮرد ﻧﻈﺮ ،از -ltﻣﺨﻔﻒ Lower
Thanﺑﻪ ﻋﻨﻮان ﮐﻮﭼﮑﺘﺮ اﺳﺖ از ﻋﺪد ﻣﻮرد ﻧﻈﺮ و از fiﺑﺮاي ﭘﺎﯾﺎن ﻫﺮ ﺳﻪ ﺷﺮط در Scriptﻣﻮرد ﻧﻈﺮﻣﺎن اﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ .ﻧﺘﯿﺠﻪ در ﻫﺮ ﺳﻪ ﺑﺎزه ﺑﺎ
اﻋﺪاد ﻣﺨﺘﻠﻒ ﺑﻪ ﺻﻮرت زﯾﺮ اﺳﺖ:
ﻣﯽﺧﻮاﻫﯿﻢ ﯾﮏ Scriptﺑﻨﻮﯾﺴﯿﻢ ﮐﻪ وﻗﺘﯽ آن را اﺟﺮا ﻣﯽﮐﻨﯿﻢ اﻋﺪاد 1ﺗﺎ 10را ﺑﺮاي ﻣﺎ ﻧﻤﺎﯾﺶ دﻫﺪ .ﺑﺮاي اﯾﻦ ﻣﻨﻈﻮر از forاﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ.
در ﺧﻂ اول ﺑﺎ ﻧﻮﺷﺘﻦ forﻣﯽﮔﻮﺋﯿﻢ ﮐﻪ ﺑﺮاي ﻣﺘﻐﯿﯿﺮ iﻣﻮارد ورودي را ﺑﻪ ﺻﻮرت ﺗﮏ ﺗﮏ ﻣﻘﺎدﯾﺮ 1 2 3 4 5 6 7 8 9 10ﻗﺮار ﺑﺪه و ﺑﻌﺪ از اﯾﻦ ﻗﺮار
دادن ﻣﻘﺎدﯾﺮ ،ﻫﺮ ﺑﺎر ﮐﻪ ﻣﻘﺪاري را درون iﻗﺮار دادي ،ﻣﺤﺘﻮﯾﺎت iرا ﻧﺸﺎن ﺑﺪه و اﯾﻦ اﻣﺮ را ﺗﺎ زﻣﺎﻧﯽ اداﻣﻪ ﺑﺪه ﮐﻪ ﺑﺎزه اﻋﺪاد ﺑﻪ اﺗﻤﺎم ﺑﺮﺳﺪ .ﺗﻮﺟﻪ ﮐﻨﯿﺪ
ﮐﻪ اﻧﺘﻬﺎي forرا ﺑﺎ doneﺑﺴﺘﻪ و doﻣﺸﺎﺑﻪ elseدر دﺳﺘﻮر ifﻋﻤﻞ ﻣﯽﮐﻨﺪ .ﻧﺘﯿﺠﻪ اﺟﺮاي اﯾﻦ Scriptﺑﻪ ﺻﻮرت زﯾﺮ اﺳﺖ:
Page 5 of 12
در ﺑﺎﻻ ﻣﻘﺎدﯾﺮ را ﺑﻪ ازاي ﻫﺮ ورودي ﺗﺎﯾﭗ ﮐﺮدﯾﻢ و ﺗﻤﺎﻣﯽ اﻋﺪاد 1ﺗﺎ 10را ﻧﻮﺷﺘﯿﻢ .اﻣﺎ اﮔﺮ ﺑﺎزه اﻋﺪاد ﻣﺎ ﻃﻮﻻﻧﯽ ﺑﺎﺷﺪ و ﻧﻮﺷﺘﻦ آن زﻣﺎﻧﺒﺮ ﺑﺎﺷﺪ
ﻣﯽﺑﺎﯾﺴﺖ از Sequenceاﺳﺘﻔﺎده ﮐﻨﯿﻢ .اﺳﺘﻔﺎده از Sequenceﺑﻪ ﻣﺎ اﯾﻦ اﻣﮑﺎن را ﻣﯽدﻫﺪ ﮐﻪ ﺗﻨﻬﺎ ﺑﺎ ﻣﺸﺨﺺﮐﺮدن ﺷﺮوع و ﺳﭙﺲ ﮔﺎم ﺗﻮاﻟﯽ ﯾﺎ
ﻣﻘﺪار ﺷﻤﺎرﻧﺪه و در ﻧﻬﺎﯾﺖ اﻧﺘﻬﺎي ﺑﺎزه ﺑﻪ ﻧﺘﯿﺠﻪ ﻣﻮرد ﻧﻈﺮ دﺳﺖ ﭘﯿﺪا ﮐﻨﯿﻢ .ﺑﺮاي ﻣﺜﺎل ﻗﺒﻞ ﺑﺎ اﺳﺘﻔﺎده از Sequenceﻣﻮارد ﺑﻪ ﺻﻮرت زﯾﺮ ﺧﻮاﻫﺪ
ﺑﻮد:
ﻣﺜﺎل دﯾﮕﺮ ﺑﺮاي اﯾﻨﮑﻪ ﺑﺨﻮاﻫﯿﻢ اﻋﺪاد 1000 900 800 700 600 500 400 300 200 100را از ﻋﺪد 1000ﺑﻪ ﺻﻮرت ﻣﻌﮑﻮس ﻧﺸﺎن دﻫﯿﻢ،
از Sequenceاﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ و ﭼﻮن ﺷﺮوع از 1000اﺳﺖ ﮔﺎم ﺗﻮاﻟﯽ را ﻣﻨﻔﯽ وارد ﻣﯽﮐﻨﯿﻢ.
ﺗﺎ اﻻن ﺑﺎ دو ﺗﮑﻨﯿﮏ ifو forآﺷﻨﺎﯾﯽ ﭘﯿﺪا ﮐﺮدﯾﻢ ﺣﺎل ﻣﯿﺨﻮاﻫﯿﻢ ﯾﮏ Scriptﺑﻨﻮﯾﺴﯿﻢ ﮐﻪ ﻋﺪد از ورودي درﯾﺎﻓﺖ ﮐﺮده و ﻣﻘﺴﻮم ﻋﻠﯿﻪﻫﺎي آن ﻋﺪد
را در ﺧﺮوﺟﯽ ﻧﻤﺎﯾﺶ دﻫﺪ .ﺑﺮاي اﯾﻦ ﻣﻨﻈﻮر ﺑﺎﯾﺪ اﺑﺘﺪا ﺑﺪاﻧﯿﻢ ﮐﻪ ﻟﯿﻨﻮﮐﺲ ﻋﻤﻠﯿﺎت ﺗﻘﺴﯿﻢ اﻋﺪاد ﺻﺤﯿﺢ را ﺑﻪ ﭼﻪ ﺻﻮرت اﻧﺠﺎم ﻣﯽدﻫﺪ .ﺑﺮاي اﯾﻦ ﻣﻨﻈﻮر
ﭼﻨﺪ ﻣﺜﺎل زﯾﺮ را در ﻧﻈﺮ ﺑﮕﯿﺮﯾﺪ:
Page 6 of 12
در ﻫﺮ ﮐﺪام از ﻣﻮارد ﺑﺎﻻ ﻟﯿﻨﻮﮐﺲ ﻋﺒﺎرت داﺧﻞ دو ﭘﺮاﻧﺘﺰ را ﻣﺤﺎﺳﺒﻪ ﮐﺮده و ﺑﺎﻗﯿﻤﺎﻧﺪه ﺗﻘﺴﯿﻢ را در ﺧﺮوﺟﯽ ﻧﺸﺎن داده اﺳﺖ .ﺑﻨﺎﺑﺮاﯾﻦ اﻋﺪادي ﮐﻪ
ﺑﺎﻗﯿﻤﺎﻧﺪه ﺗﻘﺴﯿﻢ آﻧﻬﺎ ﺑﺮ ﻋﺪد ورودي ﻣﺎ ﺻﻔﺮ ﺑﺎﺷﺪ ﺟﺰء ﻣﻘﺴﻮم ﻋﻠﯿﻪﻫﺎي آن ﻋﺪد ﻫﺴﺘﻨﺪ .ﺣﺎل ﻣﺤﺘﻮﯾﺎت Scriptﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﭼﯿﺰﻫﺎﯾﯽ ﮐﻪ ﮔﻔﺘﯿﻢ ﺑﻪ
ﺻﻮرت زﯾﺮ ﺧﻮاﻫﺪ ﺑﻮد:
* ﻧﮑﺘﻪ اول اﯾﻨﮑﻪ ﻋﺒﺎرت ”=======“ echoرا در ﺧﻂ دوم ﺑﻪ اﯾﻦ دﻟﯿﻞ آوردهاﯾﻢ ﮐﻪ در اﺟﺮاي Scriptﻋﺪد ورودي را از ﻟﯿﺴﺖ ﻣﻘﺴﻮم ﻋﻠﯿﻪﻫﺎ
ﻣﺠﺰا ﮐﻨﯿﻢ و ﻧﮑﺘﻪ دوم اﯾﻨﮑﻪ در ﻧﻮﺷﺘﻦ Sequenceاﮔﺮ ﺷﻤﺎرﻧﺪه را ﻣﺸﺨﺺ ﻧﮑﻨﯿﻢ ﺑﻪ ﺻﻮرت ﭘﯿﺶ ﻓﺮض 1در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﯽﺷﻮد.
ﻣﯽﺧﻮاﻫﯿﻢ ﺑﺮﻧﺎﻣﻪاي ﺑﻨﻮﯾﺴﯿﻢ ﮐﻪ ﺑﻪ ازاي ﻋﺪد ورودي ﮐﻪ ﺑﻪ آن ﻣﯽدﻫﯿﻢ ﻣﻘﺪار ﻓﺎﮐﺘﻮرﯾﻞ آن را ﻣﺤﺎﺳﺒﻪ ﮐﺮده و ﻧﻤﺎﯾﺶ دﻫﺪ .ﻓﺎﮐﺘﻮرﯾﻞ ﺑﻪ اﯾﻦ ﺻﻮرت
ﻣﺤﺎﺳﺒﻪ ﻣﯽﺷﻮد .A!=(A)(A-1)(A-2)…(1):در اﯾﻦ Scriptﻣﯽﺑﺎﯾﺴﺖ از Letاﺳﺘﻔﺎده ﮐﻨﯿﻢ ،ﮐﻪ اﯾﻦ اﻣﮑﺎن را داﺷﺘﻪ ﺑﺎﺷﯿﻢ ﺗﺎ ﻧﺘﯿﺠﻪ ﻫﺮ ﺿﺮب را
ﺑﻪ ﻋﻨﻮان ﻋﺎﻣﻞ ورودي ﺑﺮاي ﺿﺮب ﺑﻌﺪي در ﻧﻈﺮ ﺑﮕﯿﺮد .در ﻧﺘﯿﺠﻪ ﺑﺮاي ﻣﺜﺎل در ! 4وﻗﺘﯽ 6=3*2ﺷﺪ در ﻣﺤﺎﺳﺒﻪ ﺑﻌﺪي 6را ورودي در ﻧﻈﺮ ﮔﺮﻓﺘﻪ و
در ﻧﺘﯿﺠﻪ 24=4*6ﺷﺪه و ﻧﺘﯿﺠﻪ ﻧﻬﺎﯾﯽ ﺧﻮاﻫﺪ ﺑﻮد .دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ ﺑﻪ دو ﺻﻮرت ﻣﯽﺗﻮاﻧﯿﻢ ﮔﺎم ﺷﻤﺎرش را ﺗﻨﻈﯿﻢ ﮐﻨﯿﻢ .ﯾﺎ از ﻋﺪد ﺷﺮوع ﮐﺮده ﯾﮑﯽ
ﯾﮑﯽ ﮐﻢ ﮐﻨﯿﻢ ﺗﺎ ﺑﻪ ﯾﮏ ﺑﺮﺳﯿﻢ و ﯾﺎ اﯾﻨﮑﻪ از ﯾﮏ ﺷﺮوع ﮐﺮده و ﯾﮑﯽ ﯾﮑﯽ اﺿﺎﻓﻪ ﮐﺮده ﺗﺎ ﺑﻪ ﻋﺪد ﺑﺮﺳﯿﻢ .در اﯾﻦ Scriptﺗﻨﻬﺎ ﻧﺤﻮه ﺗﻨﻈﯿﻢ ﻋﻤﻠﮑﺮد Let
اﺳﺖ ﮐﻪ ﺑﺴﯿﺎر اﻫﻤﯿﺖ دارد .ﻧﺘﯿﺠﻪ ﺑﻪ ﺻﻮرت زﯾﺮ ﺧﻮاﻫﺪ ﺑﻮد:
Page 7 of 12
)Cron(Linux Job Scheduler
ﻣﻌﻤﻮﻻً در ﻫﺮ ﺳﯿﺴﺘﻢ ﻋﺎﻣﻠﯽ ﺻﺮف ﻧﻈﺮ از ﻧﻮع ﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ ﻧﯿﺎزﻣﻨﺪ اﯾﻦ ﻫﺴﺘﯿﻢ ﮐﻪ در ﺳﻄﻮح ﻣﺪﯾﺮﯾﺘﯽ ﯾﮏ Jobﯾﺎ Scriptدر زﻣﺎن ﻣﺸﺨﺺ ﯾﺎ در
ﺷﺮاﯾﻄﯽ ﺧﺎص اﺟﺮا ﺷﻮد .ﺑﺮاي ﻣﺜﺎل در وﯾﻨﺪوز ﺑﺎ اﺳﺘﻔﺎده از Task Schedulerﻣﯽﺗﻮاﻧﯿﻢ ﺗﻌﯿﯿﻦ ﮐﻨﯿﻢ ﮐﻪ ﺑﻪ ﻣﺤﺾ ورود ﺑﻪ ﺳﯿﺴﺘﻢ و ﯾﺎ ﭘﺲ از ﻫﺮ
ﺑﺎر راهاﻧﺪازي ﻣﺠﺪد ﺳﯿﺴﺘﻢ ﻓﺮآﯾﻨﺪي ﺧﺎص اﺟﺮا ﺷﻮد .ﻫﻤﯿﻦ اﻣﺮ در ﻟﯿﻨﻮﮐﺲ ﻫﻢ وﺟﻮد دارد و ﺑﻪ آن Cronﻣﯽﮔﻮﺋﯿﻢ .ﭘﯿﺶ از آﻧﮑﻪ ﮐﺎر ﺑﺎ Cronرا
آﻏﺎز ﮐﻨﯿﻢ اﺑﺘﺪا ﻣﯽﺑﺎﯾﺴﺖ ﺳﺮوﯾﺲ آن را ﺑﺮرﺳﯽ ﮐﻨﯿﻢ.
Page 8 of 12
ﭘﺲ از اﯾﻨﮑﻪ ﻣﺸﺎﻫﺪه ﮐﺮدﯾﻢ ﮐﻪ ﺳﺮوﯾﺲ Cronدر ﺣﺎﻟﺖ Activeﻗﺮار دارد ﺣﺎل ﻣﯽﺑﺎﯾﺴﺖ ﺑﺎ ﻧﺤﻮه ﺗﻨﻈﯿﻢ ﮐﺮدن زﻣﺎن اﺟﺮاي Jobﯾﺎ Scriptآﺷﻨﺎ
ﺷﻮﯾﻢ .ﺑﺮاي اﯾﻦ ﻣﻨﻈﻮر ﺑﺎﯾﺪ ﺑﺪاﻧﯿﻢ ﮐﻪ ﻗﺎﻟﺐ ﺗﻨﻈﯿﻢ زﻣﺎن ﺑﻪ ﺻﻮرت A B C D Eﺻﻮرت ﻣﯽﮔﯿﺮد ﮐﻪ ﺗﻮﺿﯿﺢ و ﻣﺜﺎل آن ﺑﻪ ﺻﻮرت زﯾﺮ اﺳﺖ:
:Aدﻗﯿﻘﻪ را ﻧﺸﺎن ﻣﯽدﻫﺪ ﺑﯿﻦ ﺻﻔﺮ ﺗﺎ 59
:Bﺳﺎﻋﺖ را ﻧﺸﺎن ﻣﯽدﻫﺪ ﺑﯿﻦ ﺻﻔﺮ ﺗﺎ 23
:Cروز را ﻧﺸﺎن ﻣﯽدﻫﺪ ﺑﯿﻦ 1ﺗﺎ 31
:Dﻣﺎه را ﻧﺸﺎن ﻣﯽدﻫﺪ ﺑﯿﻦ 1ﺗﺎ 12
:Eروز ﻫﻔﺘﻪ را ﻧﺸﺎن ﻣﯽدﻫﺪ ﺑﯿﻦ ﺻﻔﺮ ﺗﺎ 7
ﻧﮑﺘﻪاي ﮐﻪ در ﺧﺼﻮص روز ﻫﻔﺘﻪ وﺟﻮد دارد اﯾﻦ اﺳﺖ ﮐﻪ ﻫﺮ دو ﻋﺪد ﺻﻔﺮ و ﻫﻔﺖ ﺑﻪ ﻣﻌﻨﺎي روز ﯾﮑﺸﻨﺒﻪ اﺳﺖ و ﺑﺮ ﻣﺒﻨﺎي آن ﺑﻘﯿﻪ روزﻫﺎي ﻫﻔﺘﻪ را
ﻣﺤﺎﺳﺒﻪ ﻣﯽﮐﻨﯿﻢ .اﻟﺒﺘﻪ اﺳﺘﻔﺎده از ﺳﻪ ﺣﺮف اول ﻧﺎم روز ﻫﻢ راه دﯾﮕﺮي اﺳﺖ ﮐﻪ ﻣﯽﺗﻮان از آن اﺳﺘﻔﺎده ﮐﺮد .ﺑﻪ ﻣﺜﺎلﻫﺎي زﯾﺮ ﺗﻮﺟﻪ ﮐﻨﯿﺪ:
* * * 5 0ﻫﺮ روز 5دﻗﯿﻘﻪ ﺑﺎﻣﺪاد -ﭼﻮن ﺗﻨﻬﺎ ﻋﺪد 5ﮐﻪ ﻧﺸﺎن دﻗﯿﻘﻪ ﺑﻮده و ﻋﺪد ﺻﻔﺮ ﮐﻪ ﻧﺸﺎن ﺳﺎﻋﺖ 12ﺷﺐ ﺑﻪ ﺑﻌﺪ اﺳﺖ آﻣﺪه و ﺳﺎﯾﺮ ﭘﺎراﻣﺘﺮﻫﺎ
ﮐﻪ ﺑﻪ ﺻﻮرت ﺳﺘﺎره آﻣﺪه اﺳﺖ ﻧﺸﺎن دﻫﻨﺪه ﺗﻤﺎﻣﯽ روزﻫﺎ و ﻣﺎهﻫﺎ و ﺑﺎزه ﺗﻤﺎﻣﯽ روزﻫﺎي ﻫﻔﺘﻪ را ﺷﺎﻣﻞ ﻣﯽﺷﻮد.
* * 15 14 1ﺳﺎﻋﺖ 14:15دﻗﯿﻘﻪ اوﻟﯿﻦ روز از ﻫﺮ ﻣﺎه در ﻫﺮ روز ﻫﻔﺘﻪ ﮐﻪ ﺑﺎﺷﺪ).ﺳﺎﻋﺖ 14:15اوﻟﯿﻦ روز ﻫﺮ ﻣﺎه(
0 10 * * 2-6ﺳﺎﻋﺖ 10ﻫﺮ دوﺷﻨﺒﻪ ﺗﺎ ﺟﻤﻌﻪ ﻫﺮ روز ﻣﺎه از ﻫﺮ ﻣﺎه ﺳﺎل ﮐﻪ ﺑﺎﺷﺪ).دوﺷﻨﺒﻪﻫﺎ ﺗﺎ ﺟﻤﻌﻪﻫﺎ ﺳﺎﻋﺖ (10
* * * * */5ﻫﺮ 5دﻗﯿﻘﻪ ﯾﮑﺒﺎر در ﻫﺮ ﺳﺎﻋﺖ از ﻫﺮ روز ﻣﺎه از ﻫﺮ ﻣﺎه ﺳﺎل در ﻫﺮ روز ﻫﻔﺘﻪ ﮐﻪ ﺑﺎﺷﺪ).ﻫﺮ 5دﻗﯿﻘﻪ ﯾﮑﺒﺎر(
* * * 42 8,18ﻫﺮ 8:42و 18:42از ﻫﺮ روز ﻣﺎه ﻫﺮ ﻣﺎه ﺳﺎل در ﻫﺮ روز ﻫﻔﺘﻪ ﮐﻪ ﺑﺎﺷﺪ).ﻫﺮ روز ﺳﺎﻋﺖ 8:42و (18:42
ﺑﺎ اﺳﺘﻔﺎده از ﻓﺮﻣﺎن crontabﺑﺎ ﺳﻮﺋﯿﭻ -lﻣﯽﺗﻮاﻧﯿﻢ Job Scheduleﻫﺎي اﯾﺠﺎد ﺷﺪه ﺗﻮﺳﻂ ﮐﺎرﺑﺮ ﺟﺎري را ﻣﺸﺎﻫﺪه ﮐﻨﯿﻢ ﮐﻪ در ﻟﯿﻨﻮﮐﺲ ﺑﻪ آﻧﻬﺎ
Crontabﻫﻢ ﻣﯽﮔﻮﺋﯿﻢ .اﮔﺮ در ﺣﺎل ﺣﺎﺿﺮ Crontabﺗﻌﺮﯾﻒ ﻧﮑﺮده ﺑﺎﺷﯿﻢ ﺑﺎ ﭘﯿﻐﺎم no crontabﻣﻮاﺟﻪ ﻣﯽﺷﻮﯾﻢ.
در اداﻣﻪ ﺑﺮاي اﯾﺠﺎد ﯾﮏ Crontabدﺳﺘﻮر crontab -eرا وارد ﻣﯽﮐﻨﯿﻢ .ﺳﯿﺴﺘﻢ از ﻣﺎ ﺳﻮاﻟﯽ ﻣﺒﺘﻨﯽ ﺑﺮ اﯾﻨﮑﻪ از ﮐﺪام Editorاﺳﺘﻔﺎده ﮐﻨﯿﻢ را از
ﻣﺎ ﻣﯽﭘﺮﺳﺪ ﮐﻪ ﺑﺎ اﻧﺘﺨﺎب ﯾﮑﯽ از آﻧﻬﺎ ﻣﯽﺗﻮاﻧﯿﻢ Crontabﺧﻮد را اﯾﺠﺎد ﮐﻨﯿﻢ.
در اﯾﻨﺠﺎ ﻣﺎ از ادﯾﺘﻮر Nanoاﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ و ﺑﺎ وارد ﮐﺮدن ﻋﺪد 1وارد ﻓﺎﯾﻠﯽ ﻣﯽﺷﻮﯾﻢ ﮐﻪ در اﻧﺘﻬﺎي آن ﻣﯽﺗﻮاﻧﯿﻢ Crontabﻣﻮرد ﻧﯿﺎز ﺧﻮد را
وارد ﮐﺮده و ﺗﻨﻈﯿﻤﺎت ﻣﺮﺑﻮﻃﻪ را اﻧﺠﺎم دﻫﯿﻢ .ﺑﺎ ﺑﺎزﮐﺮدن اﯾﻦ ﻓﺎﯾﻞ ﺗﻮﺿﯿﺤﺎﺗﯽ را ﮐﻪ ﭘﯿﺶ از اﯾﻦ درﺑﺎره Crontabدادﯾﻢ ﺑﻪ ﺻﻮرت Commentدر
ﻓﺎﯾﻞ آورده ﺷﺪه اﺳﺖ و ﻣﯽﺗﻮاﻧﯿﻢ از ﻣﺜﺎﻟﯽ ﮐﻪ در ﺧﻮد ﻓﺎﯾﻞ ﻫﻢ ﻣﻮﺟﻮد اﺳﺖ ﺑﻪ ﻋﻨﻮان راﻫﻨﻤﺎﯾﯽ ﺑﺮاي ﺗﻨﻈﯿﻢ Crontabاﺳﺘﻔﺎده ﮐﻨﯿﻢ.
ﺣﺎل در اﻧﺘﻬﺎي ﻓﺎﯾﻠﯽ ﮐﻪ ﺑﺎز ﮐﺮدﯾﻢ ﯾﮏ Crontabﺗﻌﺮﯾﻒ ﻣﯽﮐﻨﯿﻢ ﺑﻪ ﻣﻌﻨﺎي اﯾﻨﮑﻪ ﺳﯿﺴﺘﻢ ﻫﺮ دﻗﯿﻘﻪ ﻓﺮﻣﺎن ) dateﺗﺎرﯾﺦ و زﻣﺎن ﺟﺎري ﺳﯿﺴﺘﻢ را
ﻧﻤﺎﯾﺶ ﻣﯽدﻫﺪ( را اﺟﺮا ﮐﺮده و ﻧﺘﯿﺠﻪ را درون ﻓﺎﯾﻠﯽ در ﻣﺴﯿﺮ /rootﺑﺎ ﻧﺎم dates.txtوارد ﮐﻨﺪ .ﺗﻨﻈﯿﻤﺎت را ذﺧﯿﺮه ﮐﺮده و ﺧﺎرج ﻣﯽﺷﻮﯾﻢ و اﯾﻦ
ﺑﺎر ﺑﺎ اﺟﺮا ﮐﺮدن ﻓﺮﻣﺎن crontab -lﺑﻪ ﻣﺎ Crontabاي را ﮐﻪ ﺗﻌﺮﯾﻒ ﮐﺮدﯾﻢ ﻧﺸﺎن ﻣﯽدﻫﺪ .ﺑﺎ ﮔﺬﺷﺖ زﻣﺎن 3دﻗﯿﻘﻪ اﻧﺘﻈﺎر دارﯾﻢ ﮐﻪ ﺳﻪ ﺑﺎر دﺳﺘﻮر
dateاﻧﺠﺎم ﺷﺪه و ﻧﺘﺎﯾﺞ در ﻓﺎﯾﻞ اﯾﺠﺎد ﺷﻮد ﺑﺮاي اﯾﻦ ﻣﻨﻈﻮر ﻣﺤﺘﻮﯾﺎت /rootو ﻓﺎﯾﻞ dates.txtرا ﻣﺸﺎﻫﺪه ﻣﯽﮐﻨﯿﻢ.
Page 9 of 12
Page 10 of 12
در ﺣﺎﻟﺘﯽ ﮐﻪ ﺗﺎ اﻻن ﺗﻮﺿﯿﺢ دادﯾﻢ ﺑﻪ واﺳﻄﻪ ﻓﺮﻣﺎن crontab -eﯾﮏ Crontabاﯾﺠﺎد ﻣﯽﮐﺮدﯾﻢ ،اﯾﻦ اﻣﺮ ﺗﻨﻬﺎ ﺑﺮاي ﮐﺎرﺑﺮي ﮐﻪ اﯾﻦ ﻓﺮﻣﺎن را وارد
ﮐﺮده اﺳﺖ Crontabاﯾﺠﺎد ﻣﯽﮐﻨﺪ .در ﻣﻮاردي ﮐﻪ در دﻧﯿﺎي واﻗﻌﯽ ﻧﯿﺎز اﺳﺖ ﺗﺎ ﺑﺮاي ﺳﺎﯾﺮ Userﻫﺎ در ﺷﺒﮑﻪ ﯾﺎ ﺣﺘﯽ درون ﯾﮏ ﺳﯿﺴﺘﻢ Crontab
ﺗﻌﺮﯾﻒ ﮐﻨﯿﻢ ﻣﯽﺑﺎﯾﺴﺖ ﺑﻪ ﻓﺎﯾﻞ crontabدر ﻣﺴﯿﺮ /etcﺑﺮوﯾﻢ ﮐﻪ در آﻧﺠﺎ ﻫﻤﺎن ﻗﺎﻟﺐ ﺗﻌﺮﯾﻒ ﺑﻪ اﺿﺎﻓﻪ ﯾﮏ ﺳﺘﻮن اﺿﺎﻓﻪ ﮐﻪ ﻣﺨﺼﻮص ﮐﺎرﺑﺮي اﺳﺖ
ﮐﻪ ﻣﯽﺧﻮاﻫﯿﻢ ﺑﺮاي آن Crontabﺗﻌﺮﯾﻒ ﮐﻨﯿﻢ وﺟﻮد دارد ﮐﻪ ﻣﯽﺗﻮاﻧﯿﻢ ﺑﺮاي ﺗﻤﺎﻣﯽ ﮐﺎرﺑﺮان Crontabﺗﻌﺮﯾﻒ ﮐﻨﯿﻢ.
ﺑﺎ اﺟﺮاي * ls /etc/cronﻧﻤﻮﻧﻪﻫﺎي داﯾﺮﮐﺘﻮريﻫﺎﯾﯽ از Cronرا ﻣﯽﺑﯿﻨﯿﻢ ﮐﻪ ﻫﺮ ﮐﺪام ﻣﺨﺼﻮص ﺳﺎﻋﺖ ،روز ،ﻣﺎه و ﻫﻔﺘﻪ ﻫﺴﺘﻨﺪ ﺑﺪﯾﻦ ﻣﻌﻨﺎ ﮐﻪ اﮔﺮ
ﯾﮏ Crontabدر آﻧﻬﺎ ﺗﻨﻈﯿﻢ ﮐﻨﯿﻢ ،ﺻﺮف ﻧﻈﺮ از اﯾﻨﮑﻪ ﻣﻬﻢ ﻧﺒﺎﺷﺪ ﺗﺎ در ﭼﻪ ﺳﺎﻋﺖ و دﻗﯿﻘﻪاي اﻧﺠﺎم ﺷﻮﻧﺪ در ﻣﺪت زﻣﺎﻧﯽ ﮐﻪ ﻣﺮﺑﻮط ﺑﻪ آن داﯾﺮﮐﺘﻮري
اﺳﺖ ﺣﺘﻤﺎً ﯾﮑﺒﺎر اﻧﺠﺎم ﻣﯽﺷﻮﻧﺪ .ﻣﺜﻼً اﮔﺮ در داﯾﺮﮐﺘﻮري cron.dailyﯾﮏ Crontabاﯾﺠﺎد ﮐﻨﯿﻢ در ﻃﻮل ﻣﺪت ﯾﮏ روز ﯾﮏ ﺑﺎر اﻧﺠﺎم ﻣﯽﺷﻮد.
Page 11 of 12
اﮔﺮ ﺑﺨﻮاﻫﯿﻢ ﺗﻨﻬﺎ ﺑﺮاي ﯾﮏ ﺑﺎر ﯾﮏ ﻋﻤﻠﯿﺎت در ﺗﺎرﯾﺦ ﺧﺎﺻﯽ ﯾﺎ زﻣﺎن ﺧﺎﺻﯽ اﺗﻔﺎق ﺑﯿﻮﻓﺘﺪ از ﻓﺮﻣﺎن atاﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ .ﺑﺪﯾﻦ ﺻﻮرت ﮐﻪ ﺑﺎ وارد ﮐﺮدن
atو ﺳﭙﺲ زﻣﺎن ﺑﻪ ﺻﻮرت now + number min/hour/dayزﻣﺎن وﻗﻮع آن را ﻣﺸﺨﺺ ﻣﯽﮐﻨﯿﻢ.
* اﮔﺮ ﺑﺨﻮاﻫﯿﻢ ﻫﺮ ﺑﺎر ﮐﻪ ﺳﯿﺴﺘﻢ راهاﻧﺪازي ﺷﺪ ﯾﮑﺒﺎر ﯾﮏ ﻓﺮآﯾﻨﺪي اﻧﺠﺎم ﺷﻮد ﺑﻪ ﺟﺎي وارد ﮐﺮدن 5آﯾﺘﻢ در ﺗﻨﻈﯿﻤﺎت از @rebootاﺳﺘﻔﺎده
ﻣﯽﮐﻨﯿﻢ .اﻟﺒﺘﻪ ﻣﺸﺎﺑﻪ اﯾﻦ اﻣﺮ ﺑﺮاي @dailyﻫﻢ ﺻﺎدق اﺳﺖ.
Page 12 of 12