
கிளாசிக் மகிழ்ச்சியான நேரம் பார்க்கவில்லை என்று எழுதினார். அந்தக் காட்டுக் காலங்களில் புரோகிராமர்களோ யூனிக்ஸ்களோ இல்லை, ஆனால் இன்று புரோகிராமர்களுக்கு நிச்சயமாகத் தெரியும்: கிரான் அவர்களுக்குப் பதிலாக நேரத்தைக் கண்காணிக்கும்.
கட்டளை வரி பயன்பாடுகள் எனக்கு ஒரு பலவீனம் மற்றும் ஒரு வேலை. sed, awk, wc, cut மற்றும் பிற பழைய புரோகிராம்கள் ஒவ்வொரு நாளும் எங்கள் சர்வர்களில் ஸ்கிரிப்ட்களால் இயக்கப்படுகின்றன. அவற்றில் பல கிரான் பணிகளாக வடிவமைக்கப்பட்டுள்ளன, இது 70 களில் இருந்து திட்டமிடப்பட்டது.
Я долго пользовался cron поверхностно, не вникая в детали, но однажды, столкнувшись с ошибкой при запуске скрипта, решил разобраться основательно. Так появилась эта статья, при написании которой я ознакомился с POSIX crontab, основными вариантами cron в популярных дистрибутивах Linux и устройством некоторых из них.
Используете Linux и запускаете задачи в cron? Вам интересна архитектура системных приложений в Unix? Тогда нам по пути!
உள்ளடக்கம்
இனங்களின் தோற்றம்
பயனர் அல்லது கணினி நிரல்களை அவ்வப்போது செயல்படுத்துவது அனைத்து இயக்க முறைமைகளிலும் ஒரு வெளிப்படையான தேவையாகும். எனவே, புரோகிராமர்கள் நீண்ட காலத்திற்கு முன்பே பணிகளை மையமாக திட்டமிட்டு செயல்படுத்த அனுமதிக்கும் சேவைகளின் தேவையை உணர்ந்தனர்.
யூனிக்ஸ் போன்ற இயங்குதளங்கள், கடந்த நூற்றாண்டின் 7களில் பெல் லேப்ஸில் புகழ்பெற்ற கென் தாம்சன் உட்பட 70களில் உருவாக்கப்பட்டது. பதிப்பு 7 யூனிக்ஸ் கிரானையும் உள்ளடக்கியது, இது தொடர்ந்து இயங்கும் சூப்பர் யூசர் பணிகளுக்கான சேவையாகும்.
ஒரு பொதுவான நவீன கிரான் ஒரு எளிய நிரலாகும், ஆனால் அசல் பதிப்பின் இயக்க வழிமுறை இன்னும் எளிமையானது: சேவை நிமிடத்திற்கு ஒரு முறை எழுந்தது, ஒரு கோப்பிலிருந்து (/etc/lib/crontab) பணிகளுடன் ஒரு அட்டவணையைப் படித்து, அதற்காக நிகழ்த்தப்பட்டது. தற்போதைய தருணத்தில் செய்யப்பட வேண்டிய பணிகளை சூப்பர் யூசர்.
பின்னர், எளிய மற்றும் பயனுள்ள சேவையின் மேம்படுத்தப்பட்ட பதிப்புகள் அனைத்து Unix போன்ற இயங்குதளங்களுடனும் வழங்கப்பட்டன.
1992 ஆம் ஆண்டில், க்ரான்டாப் வடிவமைப்பின் பொதுவான விளக்கங்கள் மற்றும் பயன்பாட்டின் செயல்பாட்டின் அடிப்படைக் கோட்பாடுகள் யூனிக்ஸ் போன்ற இயக்க முறைமைகளின் முக்கிய தரத்தில் சேர்க்கப்பட்டுள்ளன - POSIX - இதனால் ஒரு நடைமுறை தரநிலையில் இருந்து கிரான் ஒரு டி ஜூர் தரநிலையாக மாறியது.
1987 ஆம் ஆண்டில், பால் விக்ஸி, யூனிக்ஸ் பயனர்களின் கிரானைப் பற்றிய அவர்களின் விருப்பங்களைப் பற்றி ஆய்வு செய்து, டீமானின் மற்றொரு பதிப்பை வெளியிட்டார், இது பாரம்பரிய கிரானின் சில சிக்கல்களைச் சரிசெய்து அட்டவணை கோப்புகளின் தொடரியல் விரிவடைந்தது.
К третьей версии Vixie cron стал отвечать требованиям POSIX, к тому же у программы была либеральная лицензия, вернее не было вообще никакой лицензии, если не считать пожеланий в README: гарантий автор не даёт, имя автора удалять нельзя, а продавать программу можно только вместе с исходным кодом. Эти требования оказались совместимы с принципами набиравшего в те годы популярность свободного ПО, поэтому некоторые ключевые из появившихся в начале 90-х дистрибутивов Linux взяли Vixie cron в качестве системного и развивают его до сих пор.
В частности, Red Hat и SUSE развивают форк Vixie cron — cronie, а Debian и Ubuntu используют оригинальное издание Vixie cron со множеством патчей.
Давайте для начала познакомимся с описанной в POSIX пользовательской утилитой crontab, после чего разберём расширения синтаксиса, представленные в Vixie cron, и использование вариаций Vixie cron в популярных дистрибутивах Linux. И, наконец, вишенка на торте — разбор устройства демона cron.
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 கோப்புகளால் கட்டுப்படுத்தப்படுகிறது, இது முறையே crontabக்கான அணுகல் உள்ள பயனர்களையும் நிரலுக்கான அணுகல் இல்லாத பயனர்களையும் பட்டியலிடுகிறது. இந்த கோப்புகளின் இருப்பிடத்தை தரநிலை எந்த வகையிலும் கட்டுப்படுத்தாது.
தரநிலையின்படி, தொடங்கப்பட்ட நிரல்களுக்கு குறைந்தது நான்கு சுற்றுச்சூழல் மாறிகள் அனுப்பப்பட வேண்டும்:
- முகப்பு - பயனரின் முகப்பு அடைவு.
- LOGNAME — பயனர் உள்நுழைவு.
- PATH என்பது நிலையான கணினி பயன்பாடுகளைக் கண்டறியும் பாதையாகும்.
- ஷெல் — பயன்படுத்தப்பட்ட கட்டளை மொழிபெயர்ப்பாளருக்கான பாதை.
குறிப்பிடத்தக்க வகையில், இந்த மாறிகளுக்கான மதிப்புகள் எங்கிருந்து வருகின்றன என்பதைப் பற்றி POSIX எதுவும் கூறவில்லை.
சிறந்த விற்பனையாளர் - Vixie cron 3.0pl1
பிரபலமான கிரான் வகைகளின் பொதுவான மூதாதையர் Vixie cron 3.0pl1 ஆகும், இது 1992 இல் comp.sources.unix அஞ்சல் பட்டியலில் அறிமுகப்படுத்தப்பட்டது. இந்த பதிப்பின் முக்கிய அம்சங்களை இன்னும் விரிவாகக் கருதுவோம்.
விக்ஸி கிரான் இரண்டு நிரல்களில் வருகிறது (கிரான் மற்றும் க்ரான்டாப்). வழக்கம் போல், கணினி பணி அட்டவணை மற்றும் தனிப்பட்ட பயனர் பணி அட்டவணையில் இருந்து பணிகளைப் படித்து இயக்குவதற்கு டீமான் பொறுப்பாகும், மேலும் பயனர் அட்டவணைகளைத் திருத்துவதற்கு crontab பயன்பாடு பொறுப்பாகும்.
பணி அட்டவணை மற்றும் கட்டமைப்பு கோப்புகள்
சூப்பர் யூசர் பணி அட்டவணை /etc/crontab இல் உள்ளது. கணினி அட்டவணையின் தொடரியல் விக்ஸி கிரானின் தொடரியல் உடன் ஒத்துள்ளது, அதில் உள்ள ஆறாவது நெடுவரிசையானது பணி தொடங்கப்பட்ட பயனரின் பெயரைக் குறிக்கிறது.
# Запускается ежеминутно от пользователя vlad
* * * * * vlad /path/to/execவழக்கமான பயனர் பணி அட்டவணைகள் /var/cron/tabs/username இல் அமைந்துள்ளன மற்றும் அதே தொடரியல் பயன்படுத்தவும். நீங்கள் க்ரான்டாப் பயன்பாட்டை ஒரு பயனராக இயக்கும்போது, இவை திருத்தப்பட்ட கோப்புகள்.
க்ரான்டாப்பை அணுகக்கூடிய பயனர்களின் பட்டியல்கள் /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 தவிர அனைத்து மாறிகளின் மதிப்புகளையும் பயனர் அட்டவணையில் மாற்றலாம்.
சில சூழல் மாறிகள் (குறிப்பாக ஷெல் மற்றும் ஹோம்) பணியை இயக்க கிரானால் பயன்படுத்தப்படுகிறது. தனிப்பயன் பணிகளை இயக்க ஸ்டாண்டர்ட் shக்குப் பதிலாக பாஷைப் பயன்படுத்துவது எப்படி இருக்கும்:
SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/execஇறுதியில், அட்டவணையில் வரையறுக்கப்பட்ட அனைத்து சூழல் மாறிகளும் (கிரானால் பயன்படுத்தப்படும் அல்லது செயல்முறைக்குத் தேவை) இயங்கும் பணிக்கு அனுப்பப்படும்.
கோப்புகளைத் திருத்த, க்ரான்டாப் விஷுவல் அல்லது எடிட்டர் சூழல் மாறியில் குறிப்பிடப்பட்ட எடிட்டரைப் பயன்படுத்துகிறது. க்ரான்டாப் இயக்கப்பட்ட சூழலில் இந்த மாறிகள் வரையறுக்கப்படவில்லை என்றால், "/usr/ucb/vi" பயன்படுத்தப்படும் (ucb என்பது கலிபோர்னியா பல்கலைக்கழகம், பெர்க்லி).
cron в Debian и Ubuntu
உருவாக்குநர்கள் Debian и производных дистрибутивов выпустили Vixie கிரான் பதிப்பு 3.0pl1. அட்டவணை கோப்புகளின் தொடரியல் வேறுபாடுகள் இல்லை; பயனர்களுக்கு இது அதே Vixie கிரான் ஆகும். மிகப்பெரிய புதிய அம்சம்: ஆதரவு , и .
குறைவான கவனிக்கத்தக்க, ஆனால் உறுதியான மாற்றங்களில் உள்ளமைவு கோப்புகள் மற்றும் பணி அட்டவணைகள் இடம் அடங்கும்.
Пользовательские таблицы в Debian располагаются в директории /var/spool/cron/crontabs, системная таблица всё там же — в /etc/crontab. Специфичные для пакетов Debian таблицы задач помещаются в /etc/cron.d, откуда демон cron их автоматически считывает. Управление доступом пользователей регулируется файлами /etc/cron.allow и /etc/cron.deny.
В качестве командной оболочки по умолчанию по-прежнему используется /bin/sh, в роли которого в Debian выступает небольшой POSIX-совместимый шелл , எந்த உள்ளமைவையும் படிக்காமல் தொடங்கப்பட்டது (ஊடாடாத பயன்முறையில்).
Сам cron в последних версиях Debian запускается через systemd, а конфигурацию запуска можно посмотреть в /lib/systemd/system/cron.service. Ничего особенного в конфигурации сервиса нет, любое более тонкое управление задачами возможно осуществить через переменные окружения, объявленные прямо в crontab каждого из пользователей.
cronie в RedHat, Fedora и CentOS
— форк 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 பயன்படுத்தப்படுகிறது, இது நிலையான பாஷ் ஆகும். /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 cron 3.0pl1. வாசிப்பை சிக்கலாக்கும் ifdefs ஐ நீக்கி சிறிய விவரங்களைத் தவிர்த்து உதாரணங்களை எளிமையாக்குவேன்.
அரக்கனின் வேலையை பல நிலைகளாகப் பிரிக்கலாம்:
- நிரல் துவக்கம்.
- இயக்க வேண்டிய பணிகளின் பட்டியலை சேகரித்து புதுப்பித்தல்.
- மெயின் கிரான் லூப் இயங்கும்.
- ஒரு பணியைத் தொடங்குங்கள்.
அவற்றை வரிசையாகப் பார்ப்போம்.
துவக்கம்
தொடங்கும் போது, செயல்முறை வாதங்களைச் சரிபார்த்த பிறகு, கிரான் 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);பின்னர் செயல்முறை "டெமோனிஸ்டு": இது ஃபோர்க்கை அழைப்பதன் மூலம் செயல்முறையின் குழந்தை நகலை உருவாக்குகிறது மற்றும் குழந்தை செயல்பாட்டில் ஒரு புதிய அமர்வை உருவாக்குகிறது (அழைப்பு 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=மதிப்பு வடிவத்தின் கோடுகள்), அல்லது 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 யூனிக்ஸ் இலிருந்து அசல் கிரான் மிகவும் எளிமையாக வேலை செய்தது: இது ஒரு லூப்பில் உள்ளமைவை மீண்டும் படித்து, தற்போதைய நிமிடத்தின் பணிகளை ஒரு சூப்பர் யூசராக துவக்கி, அடுத்த நிமிடம் தொடங்கும் வரை தூங்கியது. பழைய கணினிகளில் இந்த எளிய அணுகுமுறைக்கு பல ஆதாரங்கள் தேவைப்பட்டன.
SysV இல் ஒரு மாற்று பதிப்பு முன்மொழியப்பட்டது, இதில் டீமான் பணி வரையறுக்கப்பட்ட மிக அருகில் உள்ள நிமிடம் வரை அல்லது 30 நிமிடங்கள் வரை தூங்கச் சென்றது. இந்த பயன்முறையில் உள்ளமைவை மீண்டும் படிக்கவும் பணிகளைச் சரிபார்க்கவும் குறைவான ஆதாரங்கள் பயன்படுத்தப்பட்டன, ஆனால் பணிகளின் பட்டியலை விரைவாகப் புதுப்பிப்பது சிரமமாகிவிட்டது.
விக்ஸி கிரான் ஒரு நிமிடத்திற்கு ஒருமுறை பணிப் பட்டியலைச் சரிபார்க்கத் திரும்பினார், அதிர்ஷ்டவசமாக 80களின் முடிவில் நிலையான யூனிக்ஸ் இயந்திரங்களில் கணிசமாக அதிக ஆதாரங்கள் இருந்தன:
/* первичная загрузка задач */
load_database(&database);
/* запустить задачи, поставленные к выполнению после перезагрузки системы */
run_reboot_jobs(&database);
/* сделать TargetTime началом ближайшей минуты */
cron_sync();
while (TRUE) {
/* выполнить задачи, после чего спать до TargetTime с поправкой на время, потраченное на задачи */
cron_sleep();
/* перечитать конфигурацию */
load_database(&database);
/* собрать задачи для данной минуты */
cron_tick(&database);
/* перевести TargetTime на начало следующей минуты */
TargetTime += 60;
}
கிரான்_ஸ்லீப் செயல்பாடு நேரடியாக பணிகளைச் செயல்படுத்துகிறது, job_runqueue (பணிகளை எண்ணி இயக்கவும்) மற்றும் do_command (ஒவ்வொரு பணியையும் இயக்கவும்) செயல்பாடுகளை அழைக்கிறது. கடைசி செயல்பாடு இன்னும் விரிவாக ஆராயத்தக்கது.
ஒரு பணியை இயக்குதல்
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;
}அது அடிப்படையில் அனைத்து கிரான் உள்ளது. நான் சில சுவாரஸ்யமான விவரங்களைத் தவிர்த்துவிட்டேன், எடுத்துக்காட்டாக, தொலைநிலை பயனர்களுக்கான கணக்கு, ஆனால் நான் முக்கிய விஷயத்தை கோடிட்டுக் காட்டினேன்.
பின்னுரை
Сron — на удивление простая и полезная программа, выполненная в лучших традициях мира Unix. Она не делает ничего лишнего, но свою работу выполняет замечательно на протяжении уже нескольких десятилетий. Ознакомление с кодом той версии, что поставляется с Ubuntu, заняло не больше часа, а удовольствия я получил массу! Надеюсь, я смог поделиться им с вами.
உங்களைப் பற்றி எனக்குத் தெரியாது, ஆனால் நவீன நிரலாக்கமானது, அதிகப்படியான சிக்கலான மற்றும் மிகை சுருக்கமான போக்குடன், நீண்ட காலமாக இத்தகைய எளிமைக்கு உகந்ததாக இல்லை என்பதை உணர்ந்ததில் எனக்கு கொஞ்சம் வருத்தமாக இருக்கிறது.
கிரானுக்கு பல நவீன மாற்றுகள் உள்ளன: systemd-டைமர்கள் சிக்கலான அமைப்புகளை சார்புகளுடன் ஒழுங்கமைக்க உங்களை அனுமதிக்கின்றன, fcron பணிகளின் மூலம் வள நுகர்வுகளை மிகவும் நெகிழ்வாகக் கட்டுப்படுத்த உங்களை அனுமதிக்கிறது. ஆனால் தனிப்பட்ட முறையில், எளிமையான கிரான்டாப் எனக்கு எப்போதும் போதுமானதாக இருந்தது.
சுருக்கமாக, Unix ஐ விரும்புங்கள், எளிய நிரல்களைப் பயன்படுத்துங்கள் மற்றும் உங்கள் தளத்திற்கான மனாவைப் படிக்க மறக்காதீர்கள்!
ஆதாரம்: www.habr.com
