ලිනක්ස් හි ක්‍රෝන්: ඉතිහාසය, භාවිතය සහ උපාංගය

ලිනක්ස් හි ක්‍රෝන්: ඉතිහාසය, භාවිතය සහ උපාංගය

ප්‍රීතිමත් පැය නරඹන්නේ නැති බව ක්ලැසික් ලිවීය. එම කාලවලදී ක්‍රමලේඛකයින් හෝ යුනික්ස් සිටියේ නැත, නමුත් අද ක්‍රමලේඛකයින් නිසැකවම දනී: ක්‍රෝන් ඔවුන් වෙනුවට කාලය නිරීක්ෂණය කරයි.

විධාන රේඛා උපයෝගිතා මට දුර්වලකමක් මෙන්ම කාර්යයකි. sed, awk, wc, cut සහ වෙනත් පැරණි වැඩසටහන් සෑම දිනකම අපගේ සේවාදායකයන් මත scripts මඟින් ක්‍රියාත්මක වේ. ඒවායින් බොහොමයක් නිර්මාණය කර ඇත්තේ 70 ගණන්වල සිට උපලේඛනකරුවෙකු වන ක්‍රෝන් සඳහා කාර්යයන් ලෙස ය.

මම දීර්ඝ කාලයක් තිස්සේ විස්තර වලට නොගොස් මතුපිටින් ක්‍රෝන් භාවිතා කළ නමුත් දිනක්, ස්ක්‍රිප්ට් එකක් ධාවනය කිරීමේදී දෝෂයක් ඇති වූ විට, එය හොඳින් සොයා බැලීමට මම තීරණය කළෙමි. මෙම ලිපිය දිස්වූයේ එලෙසිනි, එය ලියන අතරතුර ජනප්‍රිය ලිනක්ස් බෙදාහැරීම්වල ප්‍රධාන ක්‍රෝන් විකල්පයන් වන POSIX crontab සහ ඒවායින් සමහරක ව්‍යුහය මට හුරු පුරුදු විය.

ඔබ ලිනක්ස් භාවිතා කරන අතර ක්‍රෝන් කාර්යයන් ධාවනය කරන්නේද? Unix හි පද්ධති යෙදුම් ගෘහ නිර්මාණ ශිල්පය ගැන ඔබ කැමතිද? එහෙනම් අපි අපේ ගමන යනවා!

අන්තර්ගතය

විශේෂවල ආරම්භය

පරිශීලක හෝ පද්ධති වැඩසටහන් කාලානුරූපව ක්‍රියාත්මක කිරීම සියලුම මෙහෙයුම් පද්ධතිවල පැහැදිලි අවශ්‍යතාවයකි. එමනිසා, ක්‍රමලේඛකයින් බොහෝ කලකට පෙර කාර්යයන් මධ්‍යගතව සැලසුම් කිරීමට සහ ක්‍රියාත්මක කිරීමට ඉඩ සලසන සේවාවන්හි අවශ්‍යතාවය අවබෝධ කර ගත්හ.

Unix-සමාන මෙහෙයුම් පද්ධති ඔවුන්ගේ මූලාරම්භය 7 Unix අනුවාදය වෙත ආපසු ලුහුබඳින අතර, පසුගිය ශතවර්ෂයේ 70 ගණන්වල සුප්‍රසිද්ධ Ken Thompson විසින් Bell Labs හි සංවර්ධනය කරන ලදී. 7 යුනික්ස් අනුවාදයට ක්‍රෝන් ඇතුළත් විය, එය නිතිපතා ක්‍රියාත්මක වන සුපිරි පරිශීලක කාර්යයන් සඳහා සේවාවකි.

සාමාන්‍ය නවීන ක්‍රෝන් යනු සරල වැඩසටහනකි, නමුත් මුල් අනුවාදයේ ක්‍රියාකාරී ඇල්ගොරිතම ඊටත් වඩා සරල විය: සේවාව විනාඩියකට වරක් අවදි වී, තනි ගොනුවකින් (/etc/lib/crontab) කාර්යයන් සහිත වගුවක් කියවා ඒ සඳහා ක්‍රියා කරයි. වත්මන් මොහොතේ සිදු කළ යුතු කාර්යයන් superuser කරන්න.

පසුව, සියලුම යුනික්ස් වැනි මෙහෙයුම් පද්ධති සමඟ සරල සහ ප්‍රයෝජනවත් සේවාවේ වැඩිදියුණු කළ අනුවාද සපයන ලදී.

ක්‍රොන්ටැබ් ආකෘතියේ සාමාන්‍ය විස්තර සහ උපයෝගිතා ක්‍රියාකාරිත්වයේ මූලික මූලධර්ම 1992 දී යුනික්ස් වැනි මෙහෙයුම් පද්ධතිවල ප්‍රධාන ප්‍රමිතියට - POSIX-ට ඇතුළත් කරන ලද අතර, එබැවින් තථ්‍ය ප්‍රමිතියකින් ක්‍රෝන් ද ජූර් ප්‍රමිතියක් බවට පත්විය.

1987 දී, Paul Vixie, Unix භාවිතා කරන්නන් ක්‍රෝන් සඳහා ඔවුන්ගේ කැමැත්ත ගැන සමීක්ෂණයක් කර, සම්ප්‍රදායික ක්‍රෝන් හි සමහර ගැටළු නිවැරදි කර වගු ගොනු වල වාක්‍ය ඛණ්ඩය පුළුල් කළ ඩීමන් හි තවත් අනුවාදයක් නිකුත් කළේය.

Vixie cron හි තෙවන අනුවාදය වන විට POSIX අවශ්‍යතා සපුරාලීමට පටන් ගත්තේය, ඊට අමතරව, වැඩසටහනට ලිබරල් බලපත්‍රයක් තිබුණි, නැතහොත් README හි ඇති කැමැත්ත හැරෙන්නට බලපත්‍රයක් නොතිබුණි: කතුවරයා සහතිකයක් ලබා නොදේ, කර්තෘගේ නම මකා දැමිය නොහැක, සහ වැඩසටහන විකිණිය හැක්කේ ප්‍රභව කේතය සමඟ පමණි. මෙම අවශ්‍යතා එම වසරවල ජනප්‍රිය වෙමින් පැවති නිදහස් මෘදුකාංගයේ මූලධර්ම සමඟ අනුකූල විය, එබැවින් 90 දශකයේ මුල් භාගයේ දර්ශනය වූ සමහර ප්‍රධාන Linux බෙදාහැරීම් Vixie cron ඔවුන්ගේ පද්ධතිය ලෙස ගත් අතර එය අදටත් සංවර්ධනය වෙමින් පවතී.

විශේෂයෙන්ම, Red Hat සහ SUSE විසින් Vixie cron - cronie වල ගෑරුප්පුවක් නිපදවන අතර, Debian සහ Ubuntu Vixie cron හි මුල් සංස්කරණය බොහෝ පැච් සහිත භාවිතා කරයි.

අපි මුලින්ම POSIX හි විස්තර කර ඇති පරිශීලක උපයෝගිතා ක්‍රොන්ටැබ් ගැන දැන හඳුනා ගනිමු, ඉන්පසු අපි Vixie cron හි ලබා දී ඇති සින්ටැක්ස් දිගු සහ ජනප්‍රිය Linux බෙදාහැරීම්වල Vixie cron හි වෙනස්කම් භාවිතා කිරීම දෙස බලමු. අවසාන වශයෙන්, කේක් මත චෙරි යනු ක්‍රෝන් ඩේමන් උපාංගයේ විශ්ලේෂණයයි.

POSIX crontab

මුල් ක්‍රෝන් සෑම විටම සුපිරි පරිශීලකයා සඳහා ක්‍රියා කළේ නම්, නවීන උපලේඛනකරුවන් බොහෝ විට සාමාන්‍ය පරිශීලකයින්ගේ කාර්යයන් සමඟ කටයුතු කරයි, එය වඩාත් ආරක්ෂිත සහ පහසු වේ.

ක්‍රොන්ස් වැඩසටහන් දෙකක කට්ටලයක් ලෙස සපයනු ලැබේ: නිරන්තරයෙන් ක්‍රියාත්මක වන ක්‍රෝන් ඩීමන් සහ පරිශීලකයින්ට ලබා ගත හැකි ක්‍රොන්ටැබ් උපයෝගීතාව. දෙවැන්න ඔබට පද්ධතියේ එක් එක් පරිශීලකයාට විශේෂිත වූ කාර්ය වගු සංස්කරණය කිරීමට ඉඩ සලසයි, ඩීමන් පරිශීලක සහ පද්ධති වගු වලින් කාර්යයන් දියත් කරයි.

В POSIX සම්මතය ඩීමන්ගේ හැසිරීම කිසිදු ආකාරයකින් විස්තර කර නොමැති අතර පරිශීලක වැඩසටහන පමණක් විධිමත් කර ඇත පද්ධතියේ crontab. පරිශීලක කාර්යයන් දියත් කිරීම සඳහා යාන්ත්රණ පැවැත්ම, ඇත්ත වශයෙන්ම, ඇඟවුම් කර ඇත, නමුත් විස්තරාත්මකව විස්තර කර නැත.

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 ගොනු මගින් නියාමනය කරනු ලැබේ, එය පිළිවෙලින් crontab වෙත ප්‍රවේශය ඇති පරිශීලකයින් සහ වැඩසටහනට ප්‍රවේශය නොමැති පරිශීලකයින් ලැයිස්තුගත කරයි. සම්මතය මෙම ගොනු වල පිහිටීම කිසිදු ආකාරයකින් නියාමනය නොකරයි.

සම්මතයට අනුව, දියත් කරන ලද වැඩසටහන් සඳහා අවම වශයෙන් පරිසර විචල්‍ය හතරක්වත් සම්මත කළ යුතුය:

  1. HOME - පරිශීලක නිවාස නාමාවලිය.
  2. LOGNAME — පරිශීලක පිවිසුම.
  3. PATH යනු ඔබට සම්මත පද්ධති උපයෝගිතා සොයා ගත හැකි මාර්ගයයි.
  4. SHELL - භාවිතා කරන ලද විධාන පරිවර්තකය වෙත මාර්ගය.

සැලකිය යුතු ලෙස, මෙම විචල්‍යයන් සඳහා අගයන් පැමිණෙන්නේ කොහෙන්ද යන්න ගැන POSIX කිසිවක් නොකියයි.

හොඳම විකුණුම්කරු - Vixie cron 3.0pl1

ජනප්‍රිය ක්‍රෝන් ප්‍රභේදවල පොදු මුතුන් මිත්තන් වන්නේ 3.0 දී comp.sources.unix තැපැල් ලැයිස්තුවේ හඳුන්වා දුන් Vixie cron 1pl1992 ය. මෙම අනුවාදයේ ප්රධාන ලක්ෂණ අපි වඩාත් විස්තරාත්මකව සලකා බලමු.

Vixie cron වැඩසටහන් දෙකකින් (cron සහ crontab) පැමිණේ. සුපුරුදු පරිදි, පද්ධති කාර්ය වගුවෙන් සහ තනි පරිශීලක කාර්ය වගු වලින් කර්තව්‍ය කියවීම සහ ක්‍රියාත්මක කිරීම සඳහා ඩීමන් වගකිව යුතු අතර, පරිශීලක වගු සංස්කරණය කිරීම සඳහා crontab උපයෝගීතාව වගකිව යුතුය.

කාර්ය වගුව සහ වින්‍යාස ගොනු

සුපිරි පරිශීලක කාර්ය වගුව /etc/crontab හි පිහිටා ඇත. පද්ධති වගුවේ වාක්‍ය ඛණ්ඩය Vixie cron හි වාක්‍ය ඛණ්ඩයට අනුරූප වේ, එහි හයවන තීරුව මඟින් කාර්යය දියත් කරන පරිශීලකයාගේ නම දක්වයි:

# Запускается ежеминутно от пользователя vlad
* * * * * vlad /path/to/exec

සාමාන්‍ය පරිශීලක කාර්ය වගු /var/cron/tabs/username හි පිහිටා ඇති අතර එම වාක්‍ය ඛණ්ඩයම භාවිතා කරයි. ඔබ පරිශීලකයෙකු ලෙස crontab උපයෝගීතාව ධාවනය කරන විට, මේවා සංස්කරණය කරන ගොනු වේ.

crontab වෙත ප්‍රවේශය ඇති පරිශීලකයින්ගේ ලැයිස්තු කළමනාකරණය කරනු ලබන්නේ /var/cron/allow සහ /var/cron/deny ගොනු තුළ වන අතර, ඔබට පරිශීලක නාමය වෙනම පේළියකින් ඇතුළත් කිරීමට අවශ්‍ය වේ.

විස්තීරණ සින්ටැක්ස්

POSIX crontab හා සසඳන විට, Paul Vixey ගේ විසඳුමෙහි උපයෝගිතා කාර්ය වගු වල වාක්‍ය ඛණ්ඩයට ඉතා ප්‍රයෝජනවත් වෙනස් කිරීම් කිහිපයක් අඩංගු වේ.

නව වගු වාක්‍ය ඛණ්ඩයක් ලබා ගත හැකි වී ඇත: නිදසුනක් ලෙස, ඔබට සතියේ දින හෝ මාස නම අනුව නියම කළ හැක (සඳුදා, අඟහරුවාදා, සහ එසේ):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * 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

අවසාන වශයෙන්, වගුවේ අර්ථ දක්වා ඇති සියලුම පරිසර විචල්‍යයන් (ක්‍රෝන් විසින් භාවිතා කරන ලද හෝ ක්‍රියාවලියට අවශ්‍ය) ධාවන කාර්යයට යවනු ලැබේ.

ගොනු සංස්කරණය කිරීමට, crontab දෘශ්‍ය හෝ EDITOR පරිසර විචල්‍යයේ දක්වා ඇති සංස්කාරකය භාවිතා කරයි. crontab ධාවනය වූ පරිසරයේ මෙම විචල්‍යයන් නිර්වචනය කර නොමැති නම්, "/usr/ucb/vi" භාවිතා වේ (ucb බොහෝ විට කැලිෆෝනියා විශ්ව විද්‍යාලය, බර්ක්ලි).

debian සහ Ubuntu මත cron

Debian සහ ව්‍යුත්පන්න බෙදාහැරීම් සංවර්ධකයින් විසින් නිකුත් කර ඇත බෙහෙවින් වෙනස් කරන ලද අනුවාදය Vixie cron අනුවාදය 3.0pl1. වගු ගොනු වල වාක්‍ය ඛණ්ඩයේ වෙනස්කම් නොමැත; පරිශීලකයින් සඳහා එය එකම Vixie cron වේ. විශාලතම නව විශේෂාංගය: සහාය සිස්ලොග්, SELinux и PAM.

අඩු සැලකිය යුතු, නමුත් ස්පර්ශ කළ හැකි වෙනස්කම් අතර වින්‍යාස ගොනු සහ කාර්ය වගු වල පිහිටීම ඇතුළත් වේ.

ඩේබියන් හි පරිශීලක වගු පිහිටා ඇත්තේ /var/spool/cron/crontabs බහලුම තුළය, පද්ධති වගුව තවමත් පවතී - /etc/crontab හි. Debian පැකේජ-විශේෂිත කාර්ය වගු /etc/cron.d හි තැන්පත් කර ඇති අතර, ක්‍රෝන් ඩීමන් ඒවා ස්වයංක්‍රීයව කියවයි. පරිශීලක ප්‍රවේශ පාලනය පාලනය කරනු ලබන්නේ /etc/cron.allow සහ /etc/cron.deny ගොනු මගිනි.

පෙරනිමි කවචය තවමත් /bin/sh වේ, එය Debian හි කුඩා POSIX-අනුකූල කවචයකි. ඩෑෂ්, කිසිදු වින්‍යාසයක් කියවීමකින් තොරව දියත් කරන ලදී (අන්තර්ක්‍රියාකාරී නොවන ආකාරයෙන්).

Debian හි නවතම අනුවාද වල Cron එයම systemd හරහා දියත් කරනු ලබන අතර, දියත් කිරීමේ වින්‍යාසය /lib/systemd/system/cron.service හි බැලිය හැක. සේවා වින්‍යාසය තුළ විශේෂ කිසිවක් නොමැත; එක් එක් පරිශීලකයාගේ crontab හි සෘජුව ප්‍රකාශිත පරිසර විචල්‍යයන් හරහා ඕනෑම සියුම් කාර්ය කළමනාකරණයක් කළ හැක.

RedHat, Fedora සහ CentOS මත cronie

cronie - Vixie cron අනුවාදය 4.1 හි දෙබල. Debian හි මෙන්, වාක්‍ය ඛණ්ඩය වෙනස් වී නැත, නමුත් PAM සහ SELinux සඳහා සහය, පොකුරක් තුළ ක්‍රියා කිරීම, inotify භාවිතයෙන් ගොනු ලුහුබැඳීම සහ වෙනත් විශේෂාංග එකතු කර ඇත.

පෙරනිමි වින්‍යාසය සාමාන්‍ය ස්ථානවල ඇත: පද්ධති වගුව /etc/crontab හි ඇත, පැකේජ ඔවුන්ගේ වගු /etc/cron.d හි තබයි, පරිශීලක වගු /var/spool/cron/crontabs වෙත යයි.

ඩීමන් systemd පාලනය යටතේ ක්‍රියාත්මක වේ, සේවා වින්‍යාසය /lib/systemd/system/crond.service වේ.

Red Hat වැනි බෙදාහැරීම් මත, /bin/sh ආරම්භයේදී පෙරනිමියෙන් භාවිතා වේ, එය සම්මත bash වේ. /bin/sh හරහා cron jobs ධාවනය කරන විට, bash shell එක POSIX-අනුකූල මාදිලියෙන් ආරම්භ වන අතර අන්තර්ක්‍රියාකාරී නොවන ආකාරයෙන් ක්‍රියාත්මක වන අමතර වින්‍යාසයක් කියවා නොගන්නා බව සටහන් කළ යුතුය.

SLES සහ openSUSE හි cronie

ජර්මානු බෙදාහැරීමේ SLES සහ එහි ව්‍යුත්පන්න openSUSE එකම ක්‍රෝනි භාවිතා කරයි. මෙහි ඩීමන් ද systemd යටතේ දියත් කර ඇත, සේවා වින්‍යාසය /usr/lib/systemd/system/cron.service හි පිහිටා ඇත. වින්‍යාසය: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh යනු POSIX-අනුකූල අන්තර්ක්‍රියාකාරී නොවන මාදිලියේ ධාවනය වන එකම bash වේ.

Vixie cron උපාංගය

Vixie ක්‍රෝන් හා සසඳන විට ක්‍රෝන්ගේ නූතන පරම්පරාව රැඩිකල් ලෙස වෙනස් වී නැත, නමුත් තවමත් වැඩසටහනේ මූලධර්ම තේරුම් ගැනීමට අවශ්‍ය නොවන නව විශේෂාංග ලබාගෙන ඇත. මෙම දිගු බොහොමයක් දුර්වල ලෙස නිර්මාණය කර ඇති අතර කේතය අවුල් කරයි. Paul Vixey විසින් රචිත මුල් ක්‍රෝන් මූල කේතය කියවීම සතුටක්.

එබැවින්, සංවර්ධනයේ ශාඛා දෙකටම පොදු ක්‍රෝන් වැඩසටහනක උදාහරණය භාවිතා කරමින් ක්‍රෝන් උපාංගය විශ්ලේෂණය කිරීමට මම තීරණය කළෙමි - Vixie cron 3.0pl1. කියවීම අවුල් කරන ifdefs ඉවත් කිරීමෙන් සහ කුඩා විස්තර මඟ හැරීමෙන් මම උදාහරණ සරල කරමි.

යක්ෂයාගේ කාර්යය අදියර කිහිපයකට බෙදිය හැකිය:

  1. වැඩසටහන ආරම්භ කිරීම.
  2. ධාවනය කළ යුතු කාර්යයන් ලැයිස්තුව එකතු කිරීම සහ යාවත්කාලීන කිරීම.
  3. ප්‍රධාන ක්‍රෝන් ලූප් ධාවනය.
  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);

එවිට ක්‍රියාවලිය "demonized" වේ: එය දෙබලක ඇමතීමෙන් ක්‍රියාවලියේ ළමා පිටපතක් සහ ළමා ක්‍රියාවලියේ නව සැසියක් (setsid ඇමතීමෙන්) නිර්මාණය කරයි. මාපිය ක්‍රියාවලිය තවදුරටත් අවශ්‍ය නොවන අතර එය පිටවෙයි:

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);

එවිට ක්රෝන් ප්රධාන වැඩ චක්රය වෙත ගමන් කරයි. නමුත් ඊට පෙර, කාර්ය ලැයිස්තුව පැටවීම දෙස බැලීම වටී.

කාර්ය ලැයිස්තුව එකතු කිරීම සහ යාවත්කාලීන කිරීම

කාර්ය ලැයිස්තුව පූරණය කිරීම සඳහා load_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);
}

ඉන්පසු පැරණි දත්ත සමුදාය නව එකක් සමඟ ප්‍රතිස්ථාපනය වේ.

ඉහත උදාහරණවල, process_crontab ශ්‍රිත ඇමතුම මඟින් වගු ගොනු නාමයට ගැළපෙන පරිශීලකයෙකු පවතින බව තහවුරු කරයි (එය සුපිරි පරිශීලකයෙකු නොවේ නම්) පසුව load_user අමතන්න. දෙවැන්න දැනටමත් ගොනුව පේළියෙන් කියවයි:

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;
    }
}

මෙහිදී, එක්කෝ පරිසර විචල්‍යය load_env / env_set ශ්‍රිත භාවිතයෙන් (VAR=value පෝරමයේ රේඛා) සකසා ඇත, නැතහොත් load_entry ශ්‍රිතය භාවිතයෙන් කාර්ය විස්තරය (* * * * * /path/to/exec) කියවනු ලැබේ.

load_entry ආපසු ලබා දෙන ප්‍රවේශ ආයතනය අපගේ කාර්යය වන අතර එය සාමාන්‍ය කාර්ය ලැයිස්තුවේ තබා ඇත. ශ්‍රිතයම කාල ආකෘතියේ වාචික විග්‍රහයක් සිදු කරයි, නමුත් අපි පරිසර විචල්‍යයන් සහ කාර්ය දියත් කිරීමේ පරාමිතීන් ගොඩනැගීමට වැඩි කැමැත්තක් දක්වමු:

/* пользователь и группа для запуска задачи берутся из 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);

ප්රධාන ලූපය වත්මන් කාර්ය ලැයිස්තුව සමඟ ක්රියා කරයි.

ප්රධාන ලූපය

Unix අනුවාදය 7 හි මුල් ක්‍රෝන් ඉතා සරලව ක්‍රියා කළේය: එය ලූපයක් තුළ වින්‍යාසය නැවත කියවා, සුපිරි පරිශීලකයෙකු ලෙස වත්මන් මිනිත්තුවේ කාර්යයන් දියත් කර ඊළඟ මිනිත්තුව ආරම්භ වන තෙක් නිදාගත්තේය. පැරණි යන්ත්‍රවල මෙම සරල ප්‍රවේශයට බොහෝ සම්පත් අවශ්‍ය විය.

SysV හි විකල්ප අනුවාදයක් යෝජනා කරන ලද අතර, කාර්යය නිර්වචනය කරන ලද ආසන්නතම මිනිත්තුව දක්වා හෝ මිනිත්තු 30ක් සඳහා ඩීමන් නින්දට ගියේය. මෙම ප්‍රකාරයේදී වින්‍යාසය නැවත කියවීම සහ කාර්යයන් පරීක්ෂා කිරීම සඳහා අඩු සම්පත් පරිභෝජනය කරන ලද නමුත් කාර්ය ලැයිස්තුව ඉක්මනින් යාවත්කාලීන කිරීම අපහසු විය.

Vixie cron විනාඩියකට වරක් කාර්ය ලැයිස්තු පරීක්ෂා කිරීමට ආපසු පැමිණියේය, වාසනාවකට මෙන් 80 දශකයේ අවසානය වන විට සම්මත Unix යන්ත්‍රවල සැලකිය යුතු තරම් සම්පත් තිබුණි:

/* первичная загрузка задач */
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 (කාර්ය ගණන් කිරීම සහ ධාවනය කිරීම) සහ do_command (එක් එක් කාර්යය ක්‍රියාත්මක කිරීම) ශ්‍රිතයන් ඇමතීමට සෘජුවම සම්බන්ධ වේ. අවසාන කාර්යය වඩාත් විස්තරාත්මකව පරීක්ෂා කිරීම වටී.

කාර්යයක් ක්රියාත්මක කිරීම

do_command ශ්‍රිතය හොඳ යුනික්ස් විලාසයෙන් ක්‍රියාත්මක වේ, එනම්, එය කාර්යය අසමමුහුර්තව සිදු කිරීමට දෙබලක කරයි. මාපිය ක්‍රියාවලිය අඛණ්ඩව කාර්යයන් දියත් කරයි, ළමා ක්‍රියාවලිය කාර්ය ක්‍රියාවලිය සූදානම් කරයි:

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

චයිල්ඩ්_ප්‍රොසෙස් හි බොහෝ තර්ක තිබේ: එය තැපෑලට යැවීම සඳහා සම්මත ප්‍රතිදානය සහ දෝෂ ප්‍රවාහයන් තමා වෙත ගෙන යයි (කාර්ය වගුවේ 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 යනු Unix ලෝකයේ හොඳම සම්ප්‍රදායන් තුළ සාදන ලද පුදුම සහගත සරල සහ ප්‍රයෝජනවත් වැඩසටහනකි. ඇය අමතර කිසිවක් නොකරන නමුත් දශක කිහිපයක් තිස්සේ ඇය සිය කාර්යය අපූරුවට කරයි. උබුන්ටු සමඟ එන අනුවාදය සඳහා කේතය ලබා ගැනීමට පැයකට වඩා වැඩි කාලයක් ගත නොවූ අතර, මම බොහෝ විනෝදයක් ලැබුවා! මට එය ඔබ සමඟ බෙදා ගැනීමට හැකි වූ බව මම විශ්වාස කරමි.

මම ඔබ ගැන නොදනිමි, නමුත් නවීන ක්‍රමලේඛනය, අධික ලෙස සංකීර්ණ හා වියුක්ත වීමේ ප්‍රවණතාවක් සහිතව, දිගු කලක් තිස්සේ එවැනි සරලත්වයකට හිතකර නොවන බව වටහා ගැනීම ගැන මට ටිකක් කණගාටුයි.

ක්‍රෝන් සඳහා බොහෝ නවීන විකල්ප තිබේ: systemd-timers ඔබට පරායත්තතා සමඟ සංකීර්ණ පද්ධති සංවිධානය කිරීමට ඉඩ සලසයි, fcron මඟින් කාර්යයන් මගින් සම්පත් පරිභෝජනය වඩාත් නම්‍යශීලී ලෙස නියාමනය කිරීමට ඔබට ඉඩ සලසයි. නමුත් පෞද්ගලිකව, සරලම crontab මට හැම විටම ප්රමාණවත් විය.

කෙටියෙන් කිවහොත්, Unix වලට ආදරය කරන්න, සරල වැඩසටහන් භාවිතා කරන්න සහ ඔබේ වේදිකාව සඳහා mana කියවීමට අමතක නොකරන්න!

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න