Linuxలో క్రాన్: చరిత్ర, ఉపయోగం మరియు పరికరం

Linuxలో క్రాన్: చరిత్ర, ఉపయోగం మరియు పరికరం

సంతోషకరమైన గంటలు చూడకూడదని క్లాసిక్ రాసింది. ఆ క్రూరమైన కాలంలో ప్రోగ్రామర్లు లేదా యునిక్స్ లేరు, కానీ నేడు ప్రోగ్రామర్‌లకు ఖచ్చితంగా తెలుసు: క్రాన్ వారికి బదులుగా సమయాన్ని ట్రాక్ చేస్తుంది.

కమాండ్ లైన్ యుటిలిటీస్ నాకు బలహీనత మరియు పని రెండూ. sed, awk, wc, cut మరియు ఇతర పాత ప్రోగ్రామ్‌లు ప్రతిరోజూ మా సర్వర్‌లలో స్క్రిప్ట్‌ల ద్వారా అమలు చేయబడతాయి. వాటిలో చాలా వరకు క్రాన్ కోసం టాస్క్‌లుగా రూపొందించబడ్డాయి, నిజానికి 70ల నాటి షెడ్యూలర్.

చాలా కాలం వరకు నేను వివరాల్లోకి వెళ్లకుండా ఉపరితలంగా క్రాన్‌ని ఉపయోగించాను, కానీ ఒక రోజు, స్క్రిప్ట్‌ను అమలు చేస్తున్నప్పుడు లోపం ఎదురైనప్పుడు, దానిని పూర్తిగా పరిశీలించాలని నిర్ణయించుకున్నాను. ఈ వ్యాసం ఈ విధంగా కనిపించింది, దీనిని వ్రాసేటప్పుడు నాకు POSIX crontab, ప్రముఖ Linux పంపిణీలలోని ప్రధాన క్రాన్ ఎంపికలు మరియు వాటిలో కొన్నింటి నిర్మాణం గురించి బాగా తెలుసు.

మీరు Linuxని ఉపయోగిస్తున్నారా మరియు క్రాన్ టాస్క్‌లను నడుపుతున్నారా? మీకు Unixలో సిస్టమ్ అప్లికేషన్ ఆర్కిటెక్చర్ పట్ల ఆసక్తి ఉందా? అప్పుడు మేము మా మార్గంలో ఉన్నాము!

కంటెంట్

జాతుల మూలం

అన్ని ఆపరేటింగ్ సిస్టమ్‌లలో వినియోగదారు లేదా సిస్టమ్ ప్రోగ్రామ్‌ల కాలానుగుణ అమలు అనేది ఒక స్పష్టమైన అవసరం. అందువల్ల, ప్రోగ్రామర్లు చాలా కాలం క్రితం పనులను కేంద్రంగా ప్లాన్ చేయడానికి మరియు అమలు చేయడానికి అనుమతించే సేవల అవసరాన్ని గ్రహించారు.

Unix-వంటి ఆపరేటింగ్ సిస్టమ్‌లు వాటి మూలాలను వెర్షన్ 7 Unixలో గుర్తించాయి, ఇది ప్రసిద్ధ కెన్ థాంప్సన్‌తో సహా బెల్ ల్యాబ్స్‌లో గత శతాబ్దం 70లలో అభివృద్ధి చేయబడింది. వెర్షన్ 7 Unixలో క్రాన్ కూడా ఉంది, ఇది క్రమం తప్పకుండా సూపర్‌యూజర్ టాస్క్‌లను అమలు చేయడానికి ఒక సేవ.

ఒక సాధారణ ఆధునిక క్రాన్ ఒక సాధారణ ప్రోగ్రామ్, కానీ అసలు వెర్షన్ యొక్క ఆపరేటింగ్ అల్గోరిథం మరింత సరళమైనది: సేవ నిమిషానికి ఒకసారి మేల్కొంటుంది, ఒకే ఫైల్ (/etc/lib/crontab) నుండి టాస్క్‌లతో కూడిన పట్టికను చదవండి మరియు దీని కోసం ప్రదర్శించబడింది ప్రస్తుత సమయంలో నిర్వహించాల్సిన పనులను సూపర్‌యూజర్ చేయండి.

తదనంతరం, అన్ని Unix-వంటి ఆపరేటింగ్ సిస్టమ్‌లతో సరళమైన మరియు ఉపయోగకరమైన సేవ యొక్క మెరుగైన సంస్కరణలు అందించబడ్డాయి.

క్రోంటాబ్ ఫార్మాట్ యొక్క సాధారణ వివరణలు మరియు యుటిలిటీ యొక్క ఆపరేషన్ యొక్క ప్రాథమిక సూత్రాలు 1992లో Unix-వంటి ఆపరేటింగ్ సిస్టమ్స్ - POSIX యొక్క ప్రధాన ప్రమాణంలో చేర్చబడ్డాయి మరియు తద్వారా వాస్తవ ప్రమాణం నుండి క్రాన్ డి జ్యూర్ ప్రమాణంగా మారింది.

1987లో, పాల్ విక్సీ, యునిక్స్ వినియోగదారులను క్రాన్ కోసం వారి కోరికల గురించి సర్వే చేసి, డెమోన్ యొక్క మరొక సంస్కరణను విడుదల చేసింది, ఇది సాంప్రదాయ క్రాన్ యొక్క కొన్ని సమస్యలను సరిదిద్దింది మరియు టేబుల్ ఫైల్‌ల సింటాక్స్‌ను విస్తరించింది.

Vixie cron యొక్క మూడవ సంస్కరణ ద్వారా POSIX అవసరాలను తీర్చడం ప్రారంభించింది, అదనంగా, ప్రోగ్రామ్‌కు ఉదార ​​​​లైసెన్స్ ఉంది, లేదా READMEలోని కోరికలు మినహా ఎటువంటి లైసెన్స్ లేదు: రచయిత హామీలు ఇవ్వలేదు, రచయిత పేరు తొలగించబడదు మరియు ప్రోగ్రామ్ సోర్స్ కోడ్‌తో మాత్రమే విక్రయించబడుతుంది. ఈ అవసరాలు ఆ సంవత్సరాల్లో జనాదరణ పొందుతున్న ఉచిత సాఫ్ట్‌వేర్ సూత్రాలకు అనుకూలంగా మారాయి, కాబట్టి 90 ల ప్రారంభంలో కనిపించిన కొన్ని కీలకమైన Linux పంపిణీలు Vixie క్రాన్‌ను తమ సిస్టమ్‌గా తీసుకున్నాయి మరియు నేటికీ దానిని అభివృద్ధి చేస్తున్నాయి.

ప్రత్యేకించి, Red Hat మరియు SUSE Vixie cron - cronie యొక్క ఫోర్క్‌ను అభివృద్ధి చేస్తాయి మరియు Debian మరియు Ubuntu అనేక ప్యాచ్‌లతో Vixie క్రాన్ యొక్క అసలైన ఎడిషన్‌ను ఉపయోగిస్తాయి.

మొదట POSIXలో వివరించిన వినియోగదారు యుటిలిటీ క్రాంటాబ్‌తో పరిచయం చేసుకుందాం, దాని తర్వాత మేము Vixie క్రాన్‌లో అందించిన సింటాక్స్ పొడిగింపులను మరియు ప్రముఖ Linux పంపిణీలలో Vixie క్రాన్ యొక్క వైవిధ్యాల వినియోగాన్ని పరిశీలిస్తాము. చివరకు, కేక్‌పై చెర్రీ అనేది క్రాన్ డెమోన్ పరికరం యొక్క విశ్లేషణ.

POSIX క్రాంటాబ్

అసలైన క్రాన్ ఎల్లప్పుడూ సూపర్యూజర్ కోసం పనిచేస్తుంటే, ఆధునిక షెడ్యూలర్లు తరచుగా సాధారణ వినియోగదారుల పనులతో వ్యవహరిస్తారు, ఇది మరింత సురక్షితమైనది మరియు అనుకూలమైనది.

క్రాన్‌లు రెండు ప్రోగ్రామ్‌ల సమితిగా సరఫరా చేయబడతాయి: నిరంతరం నడుస్తున్న క్రాన్ డెమోన్ మరియు వినియోగదారులకు అందుబాటులో ఉన్న క్రాంటాబ్ యుటిలిటీ. డెమోన్ వినియోగదారు మరియు సిస్టమ్ పట్టికల నుండి టాస్క్‌లను లాంచ్ చేస్తున్నప్పుడు, రెండోది సిస్టమ్‌లోని ప్రతి వినియోగదారుకు నిర్దిష్ట టాస్క్ టేబుల్‌లను సవరించడానికి మిమ్మల్ని అనుమతిస్తుంది.

В POSIX ప్రమాణం డెమోన్ యొక్క ప్రవర్తన ఏ విధంగానూ వివరించబడలేదు మరియు వినియోగదారు ప్రోగ్రామ్ మాత్రమే అధికారికీకరించబడింది 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. హోమ్ - వినియోగదారు హోమ్ డైరెక్టరీ.
  2. LOGNAME — వినియోగదారు లాగిన్.
  3. PATH అనేది మీరు ప్రామాణిక సిస్టమ్ యుటిలిటీలను కనుగొనగల మార్గం.
  4. SHELL — ఉపయోగించిన కమాండ్ ఇంటర్‌ప్రెటర్‌కు మార్గం.

ముఖ్యంగా, POSIX ఈ వేరియబుల్స్ విలువలు ఎక్కడ నుండి వచ్చాయి అనే దాని గురించి ఏమీ చెప్పలేదు.

బెస్ట్ సెల్లర్ - Vixie cron 3.0pl1

జనాదరణ పొందిన క్రాన్ వేరియంట్‌ల యొక్క సాధారణ పూర్వీకుడు Vixie cron 3.0pl1, 1992లో comp.sources.unix మెయిలింగ్ జాబితాలో పరిచయం చేయబడింది. మేము ఈ సంస్కరణ యొక్క ప్రధాన లక్షణాలను మరింత వివరంగా పరిశీలిస్తాము.

Vixie క్రాన్ రెండు ప్రోగ్రామ్‌లలో వస్తుంది (క్రాన్ మరియు క్రోంటాబ్). ఎప్పటిలాగే, సిస్టమ్ టాస్క్ టేబుల్ మరియు వ్యక్తిగత వినియోగదారు టాస్క్ టేబుల్‌ల నుండి టాస్క్‌లను చదవడానికి మరియు అమలు చేయడానికి డెమోన్ బాధ్యత వహిస్తుంది మరియు వినియోగదారు పట్టికలను సవరించడానికి క్రాంటాబ్ యుటిలిటీ బాధ్యత వహిస్తుంది.

టాస్క్ టేబుల్ మరియు కాన్ఫిగరేషన్ ఫైల్స్

సూపర్యూజర్ టాస్క్ టేబుల్ /etc/crontabలో ఉంది. సిస్టమ్ టేబుల్ యొక్క వాక్యనిర్మాణం Vixie క్రాన్ యొక్క సింటాక్స్‌కు అనుగుణంగా ఉంటుంది, దానిలోని ఆరవ కాలమ్ ఎవరి తరపున పని ప్రారంభించబడిందో వినియోగదారు పేరును సూచిస్తుంది:

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

సాధారణ వినియోగదారు టాస్క్ టేబుల్‌లు /var/cron/tabs/usernameలో ఉన్నాయి మరియు అదే సింటాక్స్‌ని ఉపయోగిస్తాయి. మీరు క్రాంటాబ్ యుటిలిటీని వినియోగదారుగా అమలు చేసినప్పుడు, ఇవి సవరించబడిన ఫైల్‌లు.

క్రోంటాబ్‌కు యాక్సెస్ ఉన్న వినియోగదారుల జాబితాలు /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 కేవలం డెమోన్ ద్వారా అందించబడలేదు, కానీ ఫైల్ నుండి తీసుకోబడ్డాయి passwd. PATH వేరియబుల్ "/usr/bin:/bin"కి సెట్ చేయబడింది మరియు SHELL వేరియబుల్ "/bin/sh"కి సెట్ చేయబడింది. LOGNAME మినహా అన్ని వేరియబుల్స్ విలువలను వినియోగదారు పట్టికలలో మార్చవచ్చు.

కొన్ని ఎన్విరాన్మెంట్ వేరియబుల్స్ (ముఖ్యంగా SHELL మరియు HOME) టాస్క్‌ను అమలు చేయడానికి క్రాన్ ద్వారా ఉపయోగించబడతాయి. కస్టమ్ టాస్క్‌లను అమలు చేయడానికి ప్రామాణిక shకి బదులుగా బాష్‌ని ఉపయోగించడం ఎలా ఉంటుందో ఇక్కడ ఉంది:

SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/exec

అంతిమంగా, పట్టికలో నిర్వచించబడిన అన్ని ఎన్విరాన్మెంట్ వేరియబుల్స్ (క్రాన్ ద్వారా ఉపయోగించబడుతుంది లేదా ప్రాసెస్ ద్వారా అవసరం) రన్నింగ్ టాస్క్‌కి పంపబడతాయి.

ఫైల్‌లను సవరించడానికి, క్రోంటాబ్ విజువల్ లేదా ఎడిటర్ ఎన్విరాన్‌మెంట్ వేరియబుల్‌లో పేర్కొన్న ఎడిటర్‌ను ఉపయోగిస్తుంది. క్రాంటాబ్ అమలు చేయబడిన వాతావరణంలో ఈ వేరియబుల్స్ నిర్వచించబడకపోతే, "/usr/ucb/vi" ఉపయోగించబడుతుంది (ubb బహుశా యూనివర్సిటీ ఆఫ్ కాలిఫోర్నియా, బర్కిలీ).

డెబియన్ మరియు ఉబుంటుపై క్రాన్

డెబియన్ మరియు డెరివేటివ్ డిస్ట్రిబ్యూషన్‌ల డెవలపర్‌లు విడుదల చేశారు అత్యంత సవరించిన సంస్కరణ Vixie క్రాన్ వెర్షన్ 3.0pl1. టేబుల్ ఫైల్‌ల సింటాక్స్‌లో తేడాలు లేవు; వినియోగదారులకు ఇది అదే Vixie క్రాన్. అతిపెద్ద కొత్త ఫీచర్: మద్దతు సిస్లాగ్, SELinux и వింజమూరి.

కాన్ఫిగరేషన్ ఫైల్‌లు మరియు టాస్క్ టేబుల్‌ల స్థానం తక్కువగా గుర్తించదగినవి, కానీ స్పష్టమైన మార్పులు.

డెబియన్‌లోని వినియోగదారు పట్టికలు /var/spool/cron/crontabs డైరెక్టరీలో ఉన్నాయి, సిస్టమ్ పట్టిక ఇప్పటికీ ఉంది - /etc/crontabలో. డెబియన్ ప్యాకేజీ-నిర్దిష్ట టాస్క్ టేబుల్‌లు /etc/cron.dలో ఉంచబడతాయి, ఇక్కడ నుండి క్రాన్ డెమోన్ వాటిని స్వయంచాలకంగా చదువుతుంది. వినియోగదారు యాక్సెస్ నియంత్రణ /etc/cron.allow మరియు /etc/cron.deny ఫైల్‌ల ద్వారా నియంత్రించబడుతుంది.

డిఫాల్ట్ షెల్ ఇప్పటికీ /bin/sh, ఇది డెబియన్‌లో చిన్న POSIX-కంప్లైంట్ షెల్. డాష్, ఏ కాన్ఫిగరేషన్‌ను చదవకుండా ప్రారంభించబడింది (ఇంటరాక్టివ్ కాని మోడ్‌లో).

డెబియన్ యొక్క తాజా సంస్కరణల్లో క్రాన్ కూడా systemd ద్వారా ప్రారంభించబడింది మరియు లాంచ్ కాన్ఫిగరేషన్‌ను /lib/systemd/system/cron.serviceలో చూడవచ్చు. సేవా కాన్ఫిగరేషన్‌లో ప్రత్యేకంగా ఏమీ లేదు; ప్రతి వినియోగదారు యొక్క క్రాంటాబ్‌లో నేరుగా ప్రకటించబడిన ఎన్విరాన్‌మెంట్ వేరియబుల్స్ ద్వారా ఏదైనా మరింత సూక్ష్మమైన విధి నిర్వహణ చేయవచ్చు.

RedHat, Fedora మరియు CentOSలో క్రోనీ

cronie — ఫోర్క్ ఆఫ్ విక్సీ క్రాన్ వెర్షన్ 4.1. డెబియన్‌లో వలె, సింటాక్స్ మారలేదు, అయితే PAM మరియు SELinux కోసం మద్దతు, క్లస్టర్‌లో పని చేయడం, inotify మరియు ఇతర ఫీచర్‌లను ఉపయోగించి ఫైల్‌లను ట్రాక్ చేయడం జోడించబడింది.

డిఫాల్ట్ కాన్ఫిగరేషన్ సాధారణ ప్రదేశాలలో ఉంటుంది: సిస్టమ్ టేబుల్ /etc/crontabలో ఉంది, ప్యాకేజీలు వాటి పట్టికలను /etc/cron.dలో ఉంచుతాయి, వినియోగదారు పట్టికలు /var/spool/cron/crontabsలో వెళ్తాయి.

డెమోన్ systemd నియంత్రణలో నడుస్తుంది, సర్వీస్ కాన్ఫిగరేషన్ /lib/systemd/system/crond.service.

Red Hat-వంటి డిస్ట్రిబ్యూషన్‌లలో, /bin/sh అనేది స్టార్టప్‌లో డిఫాల్ట్‌గా ఉపయోగించబడుతుంది, ఇది ప్రామాణిక బాష్. /bin/sh ద్వారా క్రాన్ జాబ్‌లను అమలు చేస్తున్నప్పుడు, బాష్ షెల్ POSIX-కంప్లైంట్ మోడ్‌లో ప్రారంభమవుతుంది మరియు ఇంటరాక్టివ్ కాని మోడ్‌లో రన్ అవుతున్న అదనపు కాన్ఫిగరేషన్‌ను చదవదు.

SLES మరియు openSUSEలో క్రోనీ

జర్మన్ పంపిణీ SLES మరియు దాని ఉత్పన్నమైన openSUSE ఒకే క్రోనీని ఉపయోగిస్తాయి. ఇక్కడ డెమోన్ కూడా systemd క్రింద ప్రారంభించబడింది, సర్వీస్ కాన్ఫిగరేషన్ /usr/lib/systemd/system/cron.serviceలో ఉంది. కాన్ఫిగరేషన్: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh అనేది POSIX-కంప్లైంట్ నాన్-ఇంటరాక్టివ్ మోడ్‌లో నడుస్తున్న అదే బాష్.

Vixie క్రాన్ పరికరం

Vixie క్రాన్‌తో పోలిస్తే క్రాన్ యొక్క ఆధునిక వారసులు సమూలంగా మారలేదు, అయితే ప్రోగ్రామ్ యొక్క సూత్రాలను అర్థం చేసుకోవడానికి అవసరం లేని కొత్త లక్షణాలను ఇప్పటికీ పొందారు. ఈ పొడిగింపులలో చాలా వరకు పేలవంగా రూపొందించబడ్డాయి మరియు కోడ్‌ను గందరగోళానికి గురిచేస్తుంది. పాల్ విక్సీ ద్వారా ఒరిజినల్ క్రాన్ సోర్స్ కోడ్ చదవడం ఆనందంగా ఉంది.

అందువల్ల, అభివృద్ధి యొక్క రెండు శాఖలకు సాధారణమైన క్రాన్ ప్రోగ్రామ్ యొక్క ఉదాహరణను ఉపయోగించి క్రాన్ పరికరాన్ని విశ్లేషించాలని నేను నిర్ణయించుకున్నాను - 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);

అప్పుడు ప్రక్రియ “డెమోనైజ్ చేయబడింది”: ఇది ఫోర్క్‌కి కాల్ చేయడం ద్వారా ప్రాసెస్ యొక్క చైల్డ్ కాపీని మరియు చైల్డ్ ప్రాసెస్‌లో కొత్త సెషన్‌ను సృష్టిస్తుంది (సెట్‌సిడ్‌కి కాల్ చేయడం). మాతృ ప్రక్రియ ఇకపై అవసరం లేదు మరియు ఇది నిష్క్రమిస్తుంది:

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

ప్రధాన లూప్ ప్రస్తుత పనుల జాబితాతో పనిచేస్తుంది.

ప్రధాన లూప్

వెర్షన్ 7 Unix నుండి అసలైన క్రాన్ చాలా సరళంగా పనిచేసింది: ఇది లూప్‌లో కాన్ఫిగరేషన్‌ను మళ్లీ రీడ్ చేసి, ప్రస్తుత నిమిషంలోని టాస్క్‌లను సూపర్‌యూజర్‌గా ప్రారంభించింది మరియు తదుపరి నిమిషం ప్రారంభం వరకు నిద్రపోయింది. పాత మెషీన్లలో ఈ సరళమైన విధానానికి చాలా వనరులు అవసరం.

SysVలో ప్రత్యామ్నాయ సంస్కరణ ప్రతిపాదించబడింది, దీనిలో డెమోన్ టాస్క్ నిర్వచించబడిన సమీప నిమిషం వరకు లేదా 30 నిమిషాల వరకు నిద్రపోతుంది. ఈ మోడ్‌లో కాన్ఫిగరేషన్‌ను మళ్లీ చదవడం మరియు టాస్క్‌లను తనిఖీ చేయడం కోసం తక్కువ వనరులు వినియోగించబడ్డాయి, అయితే టాస్క్‌ల జాబితాను త్వరగా నవీకరించడం అసౌకర్యంగా మారింది.

Vixie క్రాన్ నిమిషానికి ఒకసారి టాస్క్ జాబితాలను తనిఖీ చేయడానికి తిరిగి వచ్చాడు, అదృష్టవశాత్తూ 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;
}

క్రాన్_స్లీప్ ఫంక్షన్ నేరుగా టాస్క్‌లను అమలు చేయడంలో పాల్గొంటుంది, జాబ్_రన్‌క్యూ (టాస్క్‌లను లెక్కించడం మరియు అమలు చేయడం) మరియు డూ_కమాండ్ (ప్రతి వ్యక్తిగత పనిని అమలు చేయడం) ఫంక్షన్‌లను పిలుస్తుంది. చివరి ఫంక్షన్ మరింత వివరంగా పరిశీలించడం విలువ.

ఒక పనిని అమలు చేస్తోంది

do_command ఫంక్షన్ మంచి Unix శైలిలో అమలు చేయబడుతుంది, అనగా, ఇది పనిని అసమకాలికంగా నిర్వహించడానికి ఫోర్క్ చేస్తుంది. పేరెంట్ ప్రాసెస్ టాస్క్‌లను ప్రారంభించడాన్ని కొనసాగిస్తుంది, పిల్లల ప్రక్రియ టాస్క్ ప్రాసెస్‌ను సిద్ధం చేస్తుంది:

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

ప్రాథమికంగా క్రాన్ అంతే. నేను కొన్ని ఆసక్తికరమైన వివరాలను విడిచిపెట్టాను, ఉదాహరణకు, రిమోట్ వినియోగదారుల కోసం అకౌంటింగ్, కానీ నేను ప్రధాన విషయాన్ని వివరించాను.

తరువాతి మాట

క్రాన్ అనేది ఆశ్చర్యకరంగా సరళమైన మరియు ఉపయోగకరమైన ప్రోగ్రామ్, ఇది Unix ప్రపంచంలోని ఉత్తమ సంప్రదాయాలలో తయారు చేయబడింది. ఆమె అదనంగా ఏమీ చేయదు, కానీ ఆమె చాలా దశాబ్దాలుగా తన పనిని అద్భుతంగా చేస్తోంది. ఉబుంటుతో వచ్చే సంస్కరణ కోసం కోడ్‌ని పొందడానికి ఒక గంట కంటే ఎక్కువ సమయం పట్టదు మరియు నేను చాలా ఆనందించాను! నేను దానిని మీతో పంచుకోగలిగానని ఆశిస్తున్నాను.

మీ గురించి నాకు తెలియదు, కానీ ఆధునిక ప్రోగ్రామింగ్ చాలా క్లిష్టంగా మరియు అతిగా నైరూప్యతతో కూడిన ధోరణితో చాలా కాలంగా అలాంటి సరళతకు అనుకూలంగా లేదని గ్రహించడం నాకు కొంచెం బాధగా ఉంది.

క్రాన్‌కు అనేక ఆధునిక ప్రత్యామ్నాయాలు ఉన్నాయి: సిస్టమ్‌డి-టైమర్‌లు డిపెండెన్సీలతో సంక్లిష్ట వ్యవస్థలను నిర్వహించడానికి మిమ్మల్ని అనుమతిస్తాయి, టాస్క్‌ల ద్వారా వనరుల వినియోగాన్ని మరింత సరళంగా నియంత్రించడానికి fcron మిమ్మల్ని అనుమతిస్తుంది. కానీ వ్యక్తిగతంగా, సరళమైన క్రోంటాబ్ ఎల్లప్పుడూ నాకు సరిపోతుంది.

సంక్షిప్తంగా, Unixని ప్రేమించండి, సాధారణ ప్రోగ్రామ్‌లను ఉపయోగించండి మరియు మీ ప్లాట్‌ఫారమ్ కోసం మనాను చదవడం మర్చిపోవద్దు!

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి