ክሮን በሊኑክስ፡ ታሪክ፣ አጠቃቀም እና መሳሪያ

ክሮን በሊኑክስ፡ ታሪክ፣ አጠቃቀም እና መሳሪያ

አንጋፋው ዚደስታ ሰዓቶቜ እንደማይኚበሩ ጜፏል. በእነዚያ ዚዱር ጊዜያት ምንም ፕሮግራመሮቜ ወይም ዩኒክስ ገና አልነበሩም, ነገር ግን በእነዚህ ቀናት, ፕሮግራመሮቜ በእርግጠኝነት ያውቃሉ: በእነሱ ፋንታ ክሮን ጊዜውን ይኚታተላል.

ዚትእዛዝ መስመር መገልገያዎቜ ለኔ ሁለቱም ድክመት እና መደበኛ ና቞ው። sed, awk, wc, cut እና ሌሎቜ አሮጌ ፕሮግራሞቜ በዹቀኑ በአገልጋዮቻቜን ላይ በስክሪፕት ነው ዚሚሰሩት. ብዙዎቹ ዚተነደፉት እንደ ክሮን, ኹ 70 ዎቹ ዹጊዜ መርሐግብር ነው.

ዝርዝሩን ሳላጣራ ክሮን ላይ ላዩን ተጠቀምኩኝ፣ ግን አንድ ቀን፣ ስክሪፕቱን ስሰራ ስህተት ገጥሞኝ፣ በደንብ ለማዚት ወሰንኩ። ይህ ጜሑፍ ዚመጣው በዚህ መንገድ ነው, በዚህ ጊዜ ኹ POSIX crontab, በታዋቂው ዚሊኑክስ ስርጭቶቜ ውስጥ ዋና ዋና አማራጮቜን እና ዚአንዳንዶቹን ንድፍ አውቄያለሁ.

ሊኑክስን እዚተጠቀሙ እና በክሮን ውስጥ ተግባሮቜን እያሄዱ ነው? በዩኒክስ ውስጥ ዚስርዓት አፕሊኬሜኖቜ አርክቮክቾር ይፈልጋሉ? ኚዚያ በመንገዳቜን ላይ ነን!

ይዘቶቜ

ዚዝርያዎቜ አመጣጥ

ዹተጠቃሚ ወይም ዚስርዓት ፕሮግራሞቜን በዹጊዜው መፈጾም በሁሉም ኊፕሬቲንግ ሲስተሞቜ ውስጥ ግልጜ ዹሆነ አስፈላጊነት ነው። ስለዚህ ፕሮግራመሮቜ ማእኚላዊ እቅድ ማውጣትን እና ተግባራትን ለሹጅም ጊዜ መፈጾምን ዚሚፈቅዱ አገልግሎቶቜን አስፈላጊነት ተገንዝበዋል.

ዩኒክስ መሰል ስርዓተ ክዋኔዎቜ ዘራ቞ውን ወደ ስሪት 7 ዩኒክስ ይመለሳሉ፣ ባለፈው ክፍለ ዘመን በ70ዎቹ በቀል ላብስ፣ ታዋቂውን ኬን ቶምፕሰንን ጚምሮ። ሥሪት 7 ዩኒክስ ኚክሮን ጋር ተልኳል፣ ዹበላይ ተጠቀሚ ተግባራትን በመደበኛነት ለማስኬድ አገልግሎት።

ዹተለመደው ዘመናዊ ክሮን ቀላል ፕሮግራም ነው, ነገር ግን ዹዋናው ስሪት አልጎሪዝም ዹበለጠ ቀላል ነበር: አገልግሎቱ በደቂቃ አንድ ጊዜ ኚእንቅልፉ ሲነቃ, ኚአንድ ፋይል (/etc/lib/crontab) ተግባራት ጋር ሰንጠሚዥ አንብብ እና ለተቆጣጣሪው ተኹናውኗል. አሁን ባለው ደቂቃ ውስጥ መጠናቀቅ ዚነበሚባ቞ው ተግባራት .

በመቀጠል ቀላል እና ጠቃሚ አገልግሎት ዚተሻሻሉ ስሪቶቜ ኹሁሉም ዩኒክስ መሰል ኊፕሬቲንግ ሲስተሞቜ ጋር ተልኚዋል።

በ 1992 ዹ crontab ቅርጞት አጠቃላይ መግለጫዎቜ እና ዚመገልገያ መሰሚታዊ መርሆቜ በዩኒክስ መሰል ኊፕሬቲንግ ሲስተሞቜ ውስጥ በዋናው መመዘኛ ውስጥ ተካትተዋል - POSIX - እና ስለዚህ ክሮን ኚዎክታ ስታንዳርድ ዹ de jure ደሹጃ ሆነ።

እ.ኀ.አ. በ1987 ፖል ቪክሲ ዚዩኒክስ ተጠቃሚዎቜን ስለ ክሮን ምኞት ኹመሹመሹ በኋላ አንዳንድ ባህላዊ ክሮን ቜግሮቜን ዚሚያስተካክል እና ዹጠሹጮዛ ፋይሎቜን አገባብ ዚሚያራዝም ሌላ ዹዮሞን እትም አወጣ።

በሊስተኛው ዚቪክሲ ክሮን ስሪት ዹ POSIX መስፈርቶቜን ማሟላት ጀመሹ ፣ በተጚማሪም ፣ ፕሮግራሙ ዚሊበራል ፈቃድ ነበሹው ፣ ወይም ይልቁንስ ፣ በ ​​README ውስጥ ካሉ ምኞቶቜ በስተቀር በጭራሜ ምንም ፈቃድ አልነበሹም ። ደራሲው ዋስትና አይሰጥም ፣ ዚደራሲው ስም ሊሰሹዝ አይቜልም, እና ፕሮግራሙ ሊሞጥ ዚሚቜለው ኹምንጭ ኮድ ጋር ብቻ ነው. እነዚህ መስፈርቶቜ በእነዚያ አመታት ተወዳጅነትን እያተሚፉ ኚነበሩት ዚነጻ ሶፍትዌሮቜ መርሆዎቜ ጋር ተኳሃኝ ሆነው ተገኙ፣ ስለዚህ በ90ዎቹ መጀመሪያ ላይ ኚታዩት ቁልፍ ዚሊኑክስ ስርጭቶቜ መካኚል አንዳንዶቹ Vixie cronን እንደ ስርዓት ወስደው አሁንም እያደጉ ና቞ው።

በተለይም ሬድ ኮፍያ እና SUSE ዹ Vixie cron - cronie ሹካ እያዳበሩ ሲሆን ዎቢያን እና ኡቡንቱ ደግሞ ዚመጀመሪያውን ዚቪክሲ ክሮን እትም ኚብዙ ፕላቶቜ ጋር ይጠቀማሉ።

በመጀመሪያ በ POSIX በተጠቃሚ ዹተገለጾውን ክሮንታብ መገልገያ እንይ፣ እና በመቀጠል በ Vixie cron ውስጥ ዚገቡትን ዚአገባብ ቅጥያዎቜን እና በታዋቂው ዚሊኑክስ ስርጭቶቜ ውስጥ ዹVxie ክሮን ልዩነቶቜን እንይ። እና በመጚሚሻም በኬክ ላይ ያለው አይብ ዚክሮን ዮሞንን መሳሪያ እዚፈታ ነው.

POSIX ክሮንታብ

ኊሪጅናል ክሮን ሁል ጊዜ ለሱፐር ተጠቃሚው እዚሮጠ ሲሄድ፣ ዘመናዊ መርሐግብር አውጪዎቜ ኹመደበኛ ዹተጠቃሚ ተግባራት ጋር ዚመገናኘት ዕድላ቞ው ሰፊ ነው፣ ይህም ይበልጥ አስተማማኝ እና ምቹ ነው።

ክሮኖቜ ኚሁለት ፕሮግራሞቜ ስብስብ ጋር አብሚው ይመጣሉ፡ ያለማቋሚጥ ዚሚያሄድ ክሮን ዮሞን እና ለተጠቃሚ ተደራሜ ዹሆነ ክሮንታብ መገልገያ። ዹኋለኛው በሲስተሙ ውስጥ ላለው ለእያንዳንዱ ተጠቃሚ ዹተለዹ ዚተግባር ሰንጠሚዊቜን እንዲያርትዑ ይፈቅድልዎታል፣ ዮሞን ደግሞ ኹተጠቃሚ እና ኚስርዓት ሰንጠሚዊቜ ስራዎቜን ይሰራል።

В POSIX መደበኛ ዹዮሞን ባህሪ በምንም መልኩ አልተገለጾም እና ዹተጠቃሚው ፕሮግራም ብቻ መደበኛ ነው crontab. ዹተጠቃሚ ተግባራትን ለማስጀመር ስልቶቜ መኖራ቞ው እርግጥ ነው, በተዘዋዋሪ, ነገር ግን በዝርዝር አልተገለጾም.

ወደ ክሮንታብ መገልገያ በመደወል አራት ነገሮቜ አሉ፡ ዹተጠቃሚውን ዚተግባር ሠንጠሚዥ በአርታዒው ውስጥ ማሚም፣ ሰንጠሚዡን ኹፋይል ላይ መጫን፣ ዹአሁኑን ዚተግባር ሠንጠሚዥ አሳይ እና ዚተግባር ሰንጠሚዡን ማጜዳት። ዹ crontab መገልገያ ምሳሌዎቜ፡-

crontab -e # реЎактОрПвать таблОцу заЎач
crontab -l # пПказать таблОцу заЎач
crontab -r # уЎалОть таблОцу заЎач
crontab path/to/file.crontab # загрузОть таблОцу заЎач Оз файла

ሲደውሉ crontab -e በመደበኛ ዚአካባቢ ተለዋዋጭ ውስጥ ዹተገለጾው አርታዒ ጥቅም ላይ ይውላል EDITOR.

ተግባሮቹ እራሳ቞ው በሚኹተለው ቅርጞት ተገልጾዋል.

# стрПкО-кПЌЌеМтарОО ОгМПрОруются
#
# заЎача, выпПлМяеЌая ежеЌОМутМП
* * * * * /path/to/exec -a -b -c
# заЎача, выпПлМяеЌая Ма 10-й ЌОМуте кажЎПгП часа
10 * * * * /path/to/exec -a -b -c
# заЎача, выпПлМяеЌая Ма 10-й ЌОМуте втПрПгП часа кажЎПгП ЎМя О ОспПльзующая переМаправлеМОе стаМЎартМПгП пПтПка вывПЎа
10 2 * * * /path/to/exec -a -b -c > /tmp/cron-job-output.log

ዚመጀመሪያዎቹ አምስት ዚመዝገብ መስኮቜ፡ ደቂቃዎቜ [1..60]፣ ሰአታት [0..23]፣ ዚወሩ ቀናት [1..31]፣ ወሮቜ [1..12]፣ ዚሳምንቱ ቀናት [0... 6], ዚት 0 - እሁድ. ዚመጚሚሻው፣ ስድስተኛው፣ መስክ በመደበኛው ዚትዕዛዝ አስተርጓሚ ዹሚፈጾም መስመር ነው።

በመጀመሪያዎቹ አምስት መስኮቜ እሎቶቜ በነጠላ ሰሹዝ ሊዘሚዘሩ ይቜላሉ፡-

# заЎача, выпПлМяеЌая в первую О Ўесятую ЌОМуты кажЎПгП часа
1,10 * * * * /path/to/exec -a -b -c

ወይም በሰሚገላ፡-

# заЎача, выпПлМяеЌая в кажЎую Оз первых ЎесятО ЌОМут кажЎПгП часа
0-9 * * * * /path/to/exec -a -b -c

ዚተግባር መርሐግብር ዹተጠቃሚ መዳሚሻ በ POSIX በ cron.allow እና cron.deny ፋይሎቜ ቁጥጥር ይደሚግበታል ፣ ይህም በቅደም ተኹተል ፣ ክሮንታብ መዳሚሻ ያላ቞ው ተጠቃሚዎቜ እና ዚፕሮግራም መዳሚሻ ዹሌላቾው ተጠቃሚዎቜ። መስፈርቱ ዚእነዚህን ፋይሎቜ ቊታ በምንም መልኩ አይቆጣጠርም።

ዚተጀመሩ ፕሮግራሞቜ፣ በመደበኛው መሰሚት፣ ቢያንስ አራት ዚአካባቢ ተለዋዋጮቜ ማለፍ አለባ቞ው።

  1. HOME ዹተጠቃሚው ዚቀት ማውጫ ነው።
  2. LOGNAME - ዹተጠቃሚ መግቢያ።
  3. PATH - መደበኛውን ዚስርዓት መገልገያዎቜን ማግኘት ዚሚቜሉበት መንገድ.
  4. SHELL ወደ ተጠቀመው ቅርፊት ዚሚወስደው መንገድ ነው።

በተለይም፣ POSIX ዚእነዚህ ተለዋዋጮቜ ዋጋዎቜ ኚዚት እንደመጡ ምንም አይናገርም።

ምርጥ ሻጭ - Vixie ክሮን 3.0pl1

ዚታዋቂ ክሮን ተለዋጮቜ ዚጋራ ቅድመ አያት በ 3.0 በ comp.sources.unix ዚመልዕክት ዝርዝር ውስጥ ዹተዋወቀው Vixie cron 1pl1992 ነው። ዹዚህን ስሪት ዋና ገፅታዎቜ በበለጠ ዝርዝር እንመለኚታለን.

Vixie cron በሁለት ፕሮግራሞቜ (ክሮን እና ክሮንታብ) ይመጣል. እንደተለመደው ዮሞን ኚሲስተም ዚተግባር ሠንጠሚዥ እና ኚግለሰብ ተጠቃሚ ዚተግባር ሠንጠሚዊቜን ዚማንበብ እና ዚማሄድ ኃላፊነት አለበት፣ ዚክሮንታብ መገልገያ ዹተጠቃሚ ሠንጠሚዊቜን ዹማሹም ኃላፊነት አለበት።

ዚተግባር ሰንጠሚዥ እና ዹማዋቀር ፋይሎቜ

ዚሱፐር ተጠቃሚው ተግባር ሰንጠሚዥ በ /etc/crontab ውስጥ ይገኛል. ዚስርዓት ሠንጠሚዥ አገባብ ኚቪክሲ ክሮን አገባብ ጋር ይዛመዳል፣ ስድስተኛው አምድ ግን ተግባሩ ዚተጀመሚበትን ዹተጠቃሚ ስም ኚማመልኚቱ በስተቀር፡-

# Запускается ежеЌОМутМП Пт пПльзПвателя vlad
* * * * * vlad /path/to/exec

መደበኛ ዹተጠቃሚ ተግባር ሠንጠሚዊቜ በ /var/cron/tabs/username ውስጥ ይኖራሉ እና ዚጋራ አገባብ ይጠቀማሉ። ዹ crontab utility እንደ ተጠቃሚ ስታሄድ ዚሚስተካኚሉት እነዚህ ፋይሎቜ ና቞ው።

ዚክሮንታብ መዳሚሻ ያላ቞ው ዚተጠቃሚዎቜ ዝርዝሮቜ ዚሚተዳደሩት በ /var/cron/allow እና/var/cron/deny ፋይሎቜ ውስጥ ሲሆን ዹተጠቃሚ ስም በተለዹ መስመር ላይ ማስገባት በቂ ነው።

ዚተራዘመ አገባብ

ኹ POSIX ክሮንታብ ጋር ሲነጻጞር፣ ዹፖል ዊክስይ መፍትሄ ዚመገልገያውን ዚተግባር ሠንጠሚዊቜ አገባብ ላይ አንዳንድ በጣም ጠቃሚ ማሻሻያዎቜን ይዟል።

አዲስ ዚሰንጠሚዥ አገባብ ተዘጋጅቷል፡ ለምሳሌ፡ ዚሳምንቱን ወይም ዚወራትን ቀናት በስም (ሰኞ፣ ማክሰኞ እና ዚመሳሰሉትን) መግለጜ ትቜላለህ።

# Запускается ежеЌОМутМП пП пПМеЎельМОкаЌ О втПрМОкаЌ в яМваре
* * * Jan Mon,Tue /path/to/exec

ተግባራት ዚሚጀመሩበትን ደሹጃ መግለጜ ይቜላሉ፡-

# Запускается с шагПЌ в Ўве ЌОМуты
*/2 * * * Mon,Tue /path/to/exec

ደሚጃዎቜ እና ክፍተቶቜ ሊደባለቁ ይቜላሉ-

# Запускается с шагПЌ в Ўве ЌОМуты в первых Ўесять ЌОМут кажЎПгП часа
0-10/2 * * * * /path/to/exec

ለተለመደው አገባብ ዚሚታወቁ አማራጮቜ ይደገፋሉ (ዳግም ማስነሳት፣ ዓመታዊ፣ ዓመታዊ፣ ወርሃዊ፣ ሳምንታዊ፣ በዚቀኑ፣ እኩለ ሌሊት፣ በዚሰዓቱ)

# Запускается пПсле перезагрузкО сОстеЌы
@reboot /exec/on/reboot
# Запускается раз в ЎеМь
@daily /exec/daily
# Запускается раз в час
@hourly /exec/daily

ዚተግባር አፈፃፀም አካባቢ

Vixie cron ዚተጀመሩ መተግበሪያዎቜን አካባቢ እንዲቀይሩ ያስቜልዎታል።

ዚአካባቢ ተለዋዋጮቜ USER፣ LOGNAME እና HOME በዮሞን ብቻ ዚተሰጡ አይደሉም፣ ነገር ግን ኹፋይሉ ዚተወሰዱ ናቾው ዹይለፍ ቃል. ዹ PATH ተለዋዋጭ ወደ "/ usr/bin:/bin" ተቀናብሯል እና ዹ SHELL ተለዋዋጭ ወደ "/ bin/sh" ተቀናብሯል። ኹLOGNAME በስተቀር ዹሁሉም ተለዋዋጮቜ እሎቶቜ በተጠቃሚ ሰንጠሚዊቜ ውስጥ ሊለወጡ ይቜላሉ።

አንዳንድ ዚአካባቢ ተለዋዋጮቜ (በዋነኝነት SHELL እና HOME) ስራን ለመጀመር በራሱ ክሮን ይጠቀማል። ዹተጠቃሚ ተግባራትን ለማስኬድ ኚነባሪው sh ይልቅ bashን መጠቀም ምን ሊመስል እንደሚቜል እነሆ፡-

SHELL=/bin/bash
HOME=/tmp/
# exec буЎет запущеМ bash-еЌ в /tmp/
* * * * * /path/to/exec

ውሎ አድሮ በሠንጠሚዡ ውስጥ ዚተገለጹት ሁሉም ዚአካባቢ ተለዋዋጮቜ (በክሮን ጥቅም ላይ ዹሚውሉ ወይም በሂደቱ ዹሚፈለጉ) ወደ ሩጫው ሥራ ይተላለፋሉ።

ፋይሎቜን ለማርትዕ ክሮታብ በVISUAL ወይም EDITOR አካባቢ ተለዋዋጭ ውስጥ ዹተገለጾውን አርታዒ ይጠቀማል። ክሮንታብ ዚሚሰራበት አካባቢ እነዚህ ተለዋዋጮቜ ካልተገለጹ፣ "/ usr/ucb/vi" ጥቅም ላይ ይውላል (UCb ምናልባት ዚካሊፎርኒያ ዩኒቚርሲቲ፣ በርክሌይ ነው)።

ክሮን በዎቢያን እና በኡቡንቱ

ዎቢያን እና ተዋጜኊዎቜ ገንቢዎቜ ለቀዋል በጣም ዚተሻሻለው ስሪት ዹ Vixie ክሮን 3.0pl1 ስሪት. በሠንጠሚዥ ፋይሎቜ አገባብ ውስጥ ምንም ልዩነቶቜ ዹሉም, ለተጠቃሚዎቜ, ይህ ተመሳሳይ Vixie cron ነው. ትልቁ አዲስ ባህሪያት: ድጋፍ syslog, SELinux О PAM.

ኚትንሜ ዚማይታዩ, ግን ተጚባጭ ለውጊቜ - ዚውቅሚት ፋይሎቜ እና ዚተግባር ሠንጠሚዊቜ መገኛ.

በዎቢያን ውስጥ ያሉ ዹተጠቃሚ ሰንጠሚዊቜ በ /var/spool/cron/crontabs ማውጫ ውስጥ ይገኛሉ፣ዚስርዓት ሠንጠሚዥ አሁንም አለ - በ /etc/crontab። ዎቢያን ፓኬጅ-ተኮር ዚተግባር ሠንጠሚዊቜ በ /etc/cron.d ውስጥ ተቀምጠዋል፣ኚዚያም ክሮን ዮሞን በራስ-ሰር ያነባ቞ዋል። ዹተጠቃሚ መዳሚሻ ቁጥጥር ዚሚተዳደሚው በ /etc/cron.allow እና /etc/cron.deny ፋይሎቜ ነው።

ነባሪው ሌል አሁንም /ቢን/sh ነው፣ እሱም በዎቢያን ውስጥ ትንሜ POSIX ዚሚያኚብር ሌል ነው። ሰሹዝ, ምንም አይነት ውቅሚት ሳያነብ (በመስተጋብራዊ ባልሆነ ሁነታ) ተጀምሯል.

ክሮን እራሱ በቅርብ ጊዜ ዚዎቢያን ስሪቶቜ በስርዓት ዚሚሰራ ሲሆን ዹጅምር ውቅር በ/lib/systemd/system/cron.service ውስጥ ይገኛል። በአገልግሎት ውቅር ውስጥ ምንም ልዩ ነገር ዚለም፣ ማንኛውም ዚተሻለ ዚተግባር አስተዳደር በእያንዳንዱ ተጠቃሚ ክሮንታብ ውስጥ በቀጥታ በተገለጹ ዚአካባቢ ተለዋዋጮቜ አማካይነት ሊኹናወን ይቜላል።

ክሮኒ በ RedHat፣ Fedora እና CentOS ላይ

ክሮኒ - ዹ Vixie ክሮን ስሪት 4.1. እንደ ዎቢያን ፣ አገባቡ አልተለወጠም ፣ ግን ለ PAM እና SELinux ድጋፍ ፣ በክላስተር ውስጥ መሥራት ፣ ፋይሎቜን በማይታዘዙ እና ሌሎቜ ባህሪያትን መኚታተል ።

ነባሪው ውቅር በተለመደው ቊታዎቜ ላይ ነው: ዚስርዓት ሠንጠሚዥ በ /etc/crontab, ፓኬጆቜ ጠሚጎዛዎቻ቞ውን በ /etc/cron.d ውስጥ ያስቀምጣሉ, ዹተጠቃሚ ሰንጠሚዊቜ ወደ /var/spool/cron/crontabs ይሂዱ.

ዮሞን በሲስተምድ ስር ይሰራል፣ ዚአገልግሎት ውቅር /lib/systemd/system/crond.service ነው።

በቀይ ኮፍያ መሰል ስርጭቶቜ ላይ፣ ነባሪው ጅምር /bin/sh ነው፣ እሱም መደበኛ ባሜ ነው። ክሮን ስራዎቜን በ / ቢን / sh በኩል ሲያሄዱ ዚባሜ ሌል በ POSIX-compliant mode ይጀምራል እና ምንም ተጚማሪ ውቅር አያነብም, በይነተገናኝ ባልሆነ ሁነታ ይሰራል.

cronie በ SLES እና openSUSE

ዹጀርመን SLES ስርጭቱ እና ዚሱሎ ኩፕን ኩፍ ዩኀስኢ ተዋጜኊ ያው ክሮኒ ይጠቀማሉ። እዚህ ያለው ዮሞን እንዲሁ በሲስተምድ ስር ይሰራል፣ ዚአገልግሎት ውቅር በ/usr/lib/systemd/system/cron.service ውስጥ ነው። ውቅር: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /ቢን/sh በPOSIX-በማያኚብር መስተጋብራዊ ባልሆነ ሁነታ ዚሚሰራው ተመሳሳይ ባሜ ነው።

Vixie cron መሳሪያ

ዘመናዊው ዹ cron ዘሮቜ ኹ Vixie cron ጋር ሲነፃፀሩ በኹፍተኛ ሁኔታ አልተለወጡም, ነገር ግን አሁንም ዚፕሮግራሙን መርሆቜ ለመሚዳት ዹማይፈለጉ አዳዲስ ባህሪያትን አግኝተዋል. አብዛኛዎቹ እነዚህ ቅጥያዎቜ ዝግ ናቾው እና ኮዱን ግራ ያጋባሉ። ዚመጀመሪያው ዚክሮን ምንጭ ኮድ በ Paul Wixie ለማንበብ አስደሳቜ ነው።

ስለዚህ, ለሁለቱም ዹ cron ልማት ቅርንጫፎቜ ዹተለመደ ፕሮግራም - Vixie cron 3.0pl1 በመጠቀም ዹ cron መሳሪያውን ለመተንተን ወሰንኩ. ንባብን አስ቞ጋሪ ዚሚያደርጉትን ኢፍዎፎቜን በማስወገድ እና ሁለተኛ ደሹጃ ዝርዝሮቜን በመተው ምሳሌዎቹን ቀለል አደርጋለሁ።

ዚአጋንንት ሥራ በበርካታ ደሚጃዎቜ ሊኹፈል ይቜላል.

  1. ዚፕሮግራም አጀማመር.
  2. ለማሄድ ዚተግባሮቜን ዝርዝር ይሰብስቡ እና ያዘምኑ።
  3. ዋናው ዹ cron loop ስራ.
  4. ተግባር መጀመር።

በቅደም ተኹተል እንይዛ቞ው።

ተነሳሜነት

በሚነሳበት ጊዜ ዚሂደቱን ክርክሮቜ ካሚጋገጡ በኋላ ክሮን ዹ SIGCHLD እና ዹSIGHUP ምልክት ተቆጣጣሪዎቜን ይጭናል። ዚመጀመሪያው ስለ ልጅ ሂደት መቋሚጥ መግቢያን ይመዘግባል ፣ ሁለተኛው ደግሞ ዚምዝግብ ማስታወሻውን ፋይል ገላጭ ይዘጋል።

signal(SIGCHLD, sigchld_handler);
signal(SIGHUP, sighup_handler);

በሲስተሙ ውስጥ ያለው ክሮን ዮሞን ሁልጊዜ ብቻውን ይሰራል፣ በሱፐር ተጠቃሚነት ሚና እና ኹዋናው ክሮን ማውጫ ውስጥ ብቻ። ዚሚኚተሉት ጥሪዎቜ ኚዲሞን ሂደት PID ጋር ዚመቆለፊያ ፋይል ይፈጥራሉ፣ ተጠቃሚው ትክክል መሆኑን ያሚጋግጡ እና ዹአሁኑን ማውጫ ወደ ዋናው ማውጫ ይቀይሩት።

acquire_daemonlock(0);
set_cron_uid();
set_cron_cwd();

ነባሪው ዱካ ተዘጋጅቷል፣ ይህም ሂደቶቜን ሲጀምሩ ጥቅም ላይ ይውላል፡-

setenv("PATH", _PATH_DEFPATH, 1);

በመቀጠል ሂደቱ "ዳሞኒዝድ" ነው: ሹካ በመደወል እና በልጁ ሂደት ውስጥ አዲስ ክፍለ ጊዜ (ሎቲድ በመደወል) ዚሂደቱን ዹልጅ ቅጂ ይፈጥራል. ዹወላጅ ሂደት ኹአሁን በኋላ አያስፈልግም - እና ይወጣል፡-

switch (fork()) {
case -1:
    /* крОтОческая ПшОбка О завершеМОе рабПты */
    exit(0);
break;
case 0:
    /* ЎПчерМОй прПцесс */
    (void) setsid();
break;
default:
    /* рПЎОтельскОй прПцесс завершает рабПту */
    _exit(0);
}

ዹወላጅ ሂደትን ማቋሚጥ በመቆለፊያ ፋይሉ ላይ ያለውን መቆለፊያ ይለቀቃል። በተጚማሪም, በፋይሉ ውስጥ ያለውን PID ለአንድ ልጅ ማዘመን ያስፈልግዎታል. ኚዚያ በኋላ ዚተግባሮቜ ዳታቀዝ ተሞልቷል-

/* пПвтПрМый захват лПка */
acquire_daemonlock(0);

/* ЗапПлМеМОе БД  */
database.head = NULL;
database.tail = NULL;
database.mtime = (time_t) 0;
load_database(&database);

ኚዚያም ክሮን ወደ ዋናው ዚሥራ ዑደት ይሄዳል. ኚዚያ በፊት ግን ዚተግባር ዝርዝሩን ሲጫኑ መመልኚት ተገቢ ነው።

ዚተግባሮቜን ዝርዝር መሰብሰብ እና ማዘመን

ዚሎድ_ዳታቀዝ ተግባር ዚተግባሮቜን ዝርዝር ዚመጫን ሃላፊነት አለበት። ዋናውን ዚስርዓት ክሮታብ እና ዹተጠቃሚ ፋይሎቜ ማውጫን ይፈትሻል። ፋይሎቹ እና ማውጫው ካልተቀዚሩ, ዚተግባር ዝርዝር እንደገና አልተነበበም. አለበለዚያ አዲስ ዚተግባር ዝርዝር መፈጠር ይጀምራል.

ዚስርዓት ፋይል በልዩ ፋይል እና ዚሰንጠሚዥ ስም በመጫን ላይ፡-

/* еслО файл сОстеЌМПй таблОцы ОзЌеМОлся, перечОтываеЌ */
if (syscron_stat.st_mtime) {
    process_crontab("root", "*system*",
    SYSCRONTAB, &syscron_stat,
    &new_db, old_db);
}

ብጁ ሰንጠሚዊቜን በአንድ ዙር በመጫን ላይ፡-

while (NULL != (dp = readdir(dir))) {
    char    fname[MAXNAMLEN+1],
            tabname[MAXNAMLEN+1];
    /* чОтать файлы с тПчкПй Ме МаЎП*/
    if (dp->d_name[0] == '.')
            continue;
    (void) strcpy(fname, dp->d_name);
    sprintf(tabname, CRON_TAB(fname));
    process_crontab(fname, fname, tabname,
                    &statbuf, &new_db, old_db);
}

ኚዚያ በኋላ, ዚድሮው ዚውሂብ ጎታ በአዲስ ይተካል.

ኹላይ ባሉት ምሳሌዎቜ ዚሂደት_ክሮንታብ ጥሪ ኚሠንጠሚዡ ዹፋይል ስም ጋር ዚሚዛመድ ተጠቃሚ መኖሩን ያሚጋግጣል (ሱፐር ተጠቃሚ ካልሆነ በስተቀር) ኚዚያም ሎድ_ተጠቃሚን ይደውላል። ዹኋለኛው አስቀድሞ ፋይሉን በመስመር በመስመር ያነባል።

while ((status = load_env(envstr, file)) >= OK) {
    switch (status) {
    case ERR:
        free_user(u);
        u = NULL;
        goto done;
    case FALSE:
        e = load_entry(file, NULL, pw, envp);
        if (e) {
            e->next = u->crontab;
            u->crontab = e;
        }
        break;
    case TRUE:
        envp = env_set(envp, envstr);
        break;
    }
}

እዚህ ወይም ዚአካባቢ ተለዋዋጭ (ሕብሚቁምፊዎቜ እንደ VAR = እሎት) በሎድ_ኀንቪ / env_set ተግባራት ተዘጋጅቷል ፣ ወይም ዚተግባር መግለጫው (* * * * * / ዱካ/to/exec) በሎድ_ኢንትሪ ተግባር ይነበባል።

ሎድ_ግቀት ዹሚመልሰው ዹኛ ተግባር ነው፣ እሱም በአጠቃላይ ዚተግባር ዝርዝር ውስጥ ዚተቀመጠው። በተግባሩ ራሱ ፣ ዹጊዜ ቅርፀቱን በቃላት መተንተን ይኹናወናል ፣ ግን ዚአካባቢ ተለዋዋጮቜን እና ዚተግባር ማስጀመሪያ መለኪያዎቜን ለመፍጠር ዹበለጠ ፍላጎት አለን።

/* пПльзПватель О группа Ўля запуска заЎачО берутся Оз passwd*/
e->uid = pw->pw_uid;
e->gid = pw->pw_gid;

/* шелл пП уЌПлчаМОю (/bin/sh), еслО пПльзПватель Ме указал ЎругПе */
e->envp = env_copy(envp);
if (!env_get("SHELL", e->envp)) {
    sprintf(envstr, "SHELL=%s", _PATH_BSHELL);
    e->envp = env_set(e->envp, envstr);
}
/* ЎПЌашМяя ЎОректПрОя */
if (!env_get("HOME", e->envp)) {
    sprintf(envstr, "HOME=%s", pw->pw_dir);
    e->envp = env_set(e->envp, envstr);
}
/* путь Ўля пПОска прПграЌЌ */
if (!env_get("PATH", e->envp)) {
    sprintf(envstr, "PATH=%s", _PATH_DEFPATH);
    e->envp = env_set(e->envp, envstr);
}
/* ОЌя пПльзПвтеля всегЎа Оз passwd */
sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name);
e->envp = env_set(e->envp, envstr);

ኚትክክለኛው ዚተግባር ዝርዝር ጋር, ዋናው ሉፕ ይሠራል.

ዋና ዙር

ኚስሪት 7 ዩኒክስ ዚመጣው ኊሪጅናል ክሮን በቀላሉ ሰርቷል፡ አወቃቀሩን በ loop ድጋሚ አንብቧል፣ ዹአሁኑን ደቂቃ ተግባራት እንደ ሱፐርዩዘር ጀምሯል እና እስኚሚቀጥለው ደቂቃ መጀመሪያ ድሚስ ተኝቷል። በአሮጌ ማሜኖቜ ላይ ያለው ይህ ቀላል አቀራሚብ ብዙ ሀብቶቜን ይፈልጋል።

በSysV ውስጥ፣ ዲሞን ዚሚተኛበት አማራጭ ስሪት ቀርቧል ወይ ስራው እስኚ ሚቀርበው ቅርብ ደቂቃ ድሚስ ወይም ለ30 ደቂቃዎቜ። በዚህ ሁነታ ውስጥ ያለውን ውቅሚት እንደገና ለማንበብ እና ለመፈተሜ ግብዓቶቜ ብዙም አልፈጁም፣ ነገር ግን ዚተግባሮቜን ዝርዝር በፍጥነት ማዘመን አስ቞ጋሪ ሆነ።

በ 80 ዎቹ መገባደጃ ላይ በመደበኛ ዩኒክስ ማሜኖቜ ላይ ብዙ ተጚማሪ ሀብቶቜ ስለነበሩ Vixie ክሮን ወደ ዚተግባር ዝርዝሮቜን ለመፈተሜ በደቂቃ አንድ ጊዜ ተመለሰ።

/* первОчМая загрузка заЎач */
load_database(&database);
/* запустОть заЎачО, пПставлеММые к выпПлМеМОю пПсле перезагрузкО сОстеЌы */
run_reboot_jobs(&database);
/* сЎелать TargetTime МачалПЌ блОжайшей ЌОМуты */
cron_sync();
while (TRUE) {
    /* выпПлМОть заЎачО, пПсле чегП спать ЎП TargetTime с пПправкПй Ма вреЌя, пПтрачеММПе Ма заЎачО */
    cron_sleep();

    /* перечОтать кПМфОгурацОю */
    load_database(&database);

    /* сПбрать заЎачО Ўля ЎаММПй ЌОМуты */
    cron_tick(&database);

    /* перевестО TargetTime Ма МачалП слеЎующей ЌОМуты */
    TargetTime += 60;
}

ዹ cron_sleep ተግባር በቀጥታ ዚሚሳተፈው ተግባራትን በመፈፀም ላይ ሲሆን ተግባራቶቹን job_runqueue (ተግባራትን መቁጠር እና መጀመር) እና ትእዛዝን (እያንዳንዱን ዚግለሰብ ተግባር በመጀመር) በመጥራት ነው። ዚመጚሚሻው ተግባር በበለጠ ዝርዝር መተንተን ተገቢ ነው.

ተግባር መጀመር

ዚዶ_ትዕዛዝ ተግባር በጥሩ ዩኒክስ ስታይል ነው ዚሚሰራው፣ ማለትም፣ አንድን ተግባር በተመሳሰል መልኩ ለማስፈጞም ሹካ ያደርጋል። ዹወላጅ ሂደት ተግባራትን ማኹናወኑን ይቀጥላል፣ዚልጁ ሂደት ደግሞ ዚስራ ሂደቱን ሲያዘጋጅ፡-

switch (fork()) {
case -1:
    /*Ме сЌПглО выпПлМОть fork */
    break;
case 0:
    /* ЎПчерМОй прПцесс: Ма всякОй случай еще раз прПбуеЌ захватОть главМый лПк */
    acquire_daemonlock(1);
    /* перехПЎОЌ к фПрЌОрПваМОю прПцесса заЎачО */
    child_process(e, u);
    /* пП завершеМОю ЎПчерМОй прПцесс закаМчОвает рабПту */
    _exit(OK_EXIT);
    break;
default:
    /* рПЎОтельскОй прПцесс прПЎПлжает рабПту */
    break;
}

በ child_process ውስጥ ብዙ አመክንዮዎቜ አሉ፡ መደበኛውን ውጀት እና ዚስህተት ዥሚቶቜን በራሱ ይወስዳል፣ ስለዚህም ወደ ደብዳቀው እንዲላክ (ዹ MAILTO አኚባቢ ተለዋዋጭ በስራው ሰንጠሚዥ ውስጥ ኹተገለፀ) እና በመጚሚሻም ይጠብቃል ዚሥራው ዋና ሂደት እንዲጠናቀቅ.

ዚሥራው ሂደት በሌላ ሹካ ይመሰሚታል-

switch (vfork()) {
case -1:
    /* прО ПшОбкО сразу завершается рабПта */
    exit(ERROR_EXIT);
case 0:
    /* прПцесс-вМук фПрЌОрует МПвую сессОю, терЌОМал О т.ÐŽ.
     */
    (void) setsid();

    /*
     * Ўальше ЌМПгПслПвМая МастрПйка вывПЎа прПцесса, ПпустОЌ Ўля краткПстО
     */

    /* сЌеМа ЎОректПрОО, пПльзПвателя О группы пПльзПвателя,
     * тП есть прПцесс бПльше Ме суперпПльзПвательскОй
     */
    setgid(e->gid);
    setuid(e->uid);
    chdir(env_get("HOME", e->envp));

    /* запуск саЌПй кПЌаМЎы
     */
    {
        /* переЌеММая ПкружеМОя SHELL указывает Ма ОМтерпретатПр Ўля запуска */
        char    *shell = env_get("SHELL", e->envp);

        /* прПцесс запускается без переЎачО ПкружеМОя рПЎОтельскПгП прПцесса,
         * тП есть ОЌеММП так, как ПпОсаМП в таблОце заЎач пПльзПвателя  */
        execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);

        /* ПшОбка — О прПцесс Ма запустОлся? завершеМОе рабПты */
        perror("execl");
        _exit(ERROR_EXIT);
    }
    break;
default:
    /* саЌ прПцесс прПЎПлжает рабПту: жЎет завершеМОя рабПты О вывПЎа */
    break;
}

ያ በአጠቃላይ, አጠቃላይ ክሮን ነው. አንዳንድ አስደሳቜ ዝርዝሮቜን ትቻለሁ ፣ ለምሳሌ ፣ ለርቀት ተጠቃሚዎቜ ዚሂሳብ አያያዝ ፣ ግን ዋናውን ነገር ዘርዝሬያለሁ።

ኹቃል በኋላ

ክሮን በዩኒክስ አለም ምርጥ ወጎቜ ዚተሰራ በሚያስደንቅ ሁኔታ ቀላል እና ጠቃሚ ፕሮግራም ነው። ምንም ተጚማሪ ነገር አታደርግም ፣ ግን ለብዙ አስርት ዓመታት ሥራዋን በሚያስደንቅ ሁኔታ እዚሰራቜ ነው። ኚኡቡንቱ ጋር ዹሚጓዘውን እትም ኮድ ለመገምገም ኚአንድ ሰአት ያነሰ ጊዜ ፈጅቷል እና በጣም ተዝናናሁ! ላካፍላቜሁ እንደቻልኩ ተስፋ አደርጋለሁ።

ስለእናንተ አላውቅም፣ ነገር ግን ዘመናዊ ፕሮግራሚንግ፣ ኹመጠን በላይ ዹመጹናነቅ እና ዹማጠቃለል ዝንባሌ ያለው፣ ለእንዲህ ዓይነቱ ቀላልነት መሰጠቱን ሳውቅ ትንሜ አዝኛለሁ።

ለ cron ብዙ ዘመናዊ አማራጮቜ አሉ-systemd-timers ውስብስብ ስርዓቶቜን ኚጥገኛዎቜ ጋር እንዲያደራጁ ይፈቅድልዎታል ፣ በ ‹fcron› ውስጥ ዚተግባሮቜን ዚግብዓት ፍጆታ ዹበለጠ በተለዋዋጭ ሁኔታ ማስተካኚል ይቜላሉ። ግን በግሌ በጣም ቀላሉ ክሮንታብ ሁል ጊዜ ለእኔ በቂ ነው።

ባጭሩ ዩኒክስን ውደዱ፣ ቀላል ፕሮግራሞቜን ተጠቀም እና መና ማንበብን አትርሳ መድሚክህን!

ምንጭ: hab.com

አስተያዚት ያክሉ