Cron in Linux: taariikhda, isticmaalka iyo qalabka

Cron in Linux: taariikhda, isticmaalka iyo qalabka

Classic ayaa qoray in saacadaha farxaddu aysan daawan. Waqtiyadaas duurjoogta ah ma jirin barnaamijyo ama Unix, laakiin barnaamijyada maanta waa hubaal: cron ayaa ilaalin doona wakhtiga halkii ay ka ahaan lahaayeen.

Adeegaha khadka talisku labaduba waa daciifnimo iyo hawl-qabad aniga. sed, awk, wc, cut iyo barnaamijyada kale ee duugga ah waxaa maamula qoraallo ku jira server-keena maalin kasta. Qaar badan oo iyaga ka mid ah ayaa loo qaabeeyey sidii hawlo loogu talagalay cron, jadwaliye asal ahaan ka soo jeeda 70-meeyadii.

Muddo dheer waxaan isticmaali jiray cron si qoto dheer, anigoon tafaasiil ka bixin, laakiin maalin maalmaha ka mid ah, markii aan la kulmay qalad markii aan socodsiiyay qoraalka, waxaan go'aansaday inaan si fiican u eego. Tani waa sida maqaalkani u muuqday, markii aan qorayay waxaan bartay POSIX crontab, fursadaha ugu weyn ee cron ee qaybinta caanka ah ee Linux iyo qaabka qaarkood.

Ma isticmaaleysaa Linux oo ma waddaa hawlaha cron? Ma xiisaynaysaa hab-dhismeedka codsiga nidaamka Unix? Markaa waanu soconaa!

Tusmo

Asalka noocyada

Ku-fulinta joogtada ah ee isticmaalaha ama barnaamijyada nidaamka waa daruuri muuqata dhammaan nidaamyada hawlgalka. Sidaa darteed, barnaamij-bixiyeyaashu waxay xaqiiqsadeen baahida loo qabo adeegyada u oggolaanaya inay si dhexe u qorsheeyaan oo ay fuliyaan hawlaha wakhti dheer ka hor.

Nidaamyada hawlgallada u eg Unix waxay asalkooda dib ugu noqdaan Nooca 7 Unix, oo la sameeyay 70-meeyadii qarnigii hore ee Bell Labs, oo uu ku jiro Ken Thompson ee caanka ah. Nooca 7 Unix waxa kale oo ka mid ahaa cron, oo ah adeeg loogu talagalay in si joogto ah loo qabto hawlaha superuser.

Cron-ka caadiga ah ee casriga ah waa barnaamij fudud, laakiin algorithm hawlgalka ee nooca asalka ah ayaa xitaa ka fudud: adeeggu wuxuu toosay hal mar daqiiqadii, akhri miis leh hawlo hal fayl ah (/etc/lib/crontab) oo loo sameeyay kor u qaad hawlahaa ay ahayd in la qabto wakhtigan xaadirka ah .

Ka dib, noocyada la hagaajiyay ee adeegga fudud ee waxtarka leh ayaa la keenay dhammaan nidaamyada hawlgalka ee Unix u eg.

Sharaxaadaha guud ee qaabka crontab iyo mabaadi'da aasaasiga ah ee hawlgalka tamarta ayaa lagu daray halbeegga ugu muhiimsan ee nidaamyada hawlgalka Unix-sida - POSIX - 1992, sidaas darteed cron oo ka soo jeeda heerka de facto wuxuu noqday heerka de jure.

Sannadkii 1987-kii, Paul Vixie, isaga oo ka waraystay isticmaalayaasha Unix ee ku saabsan rabitaankooda cron, ayaa sii daayay nooc kale oo daemon ah kaas oo saxay qaar ka mid ah dhibaatooyinka cron-dhaqameedka oo balaariyay syntax ee faylasha miiska.

Nooca saddexaad ee Vixie cron wuxuu bilaabay inuu buuxiyo shuruudaha POSIX, marka lagu daro, barnaamijku wuxuu lahaa shatiga xorta ah, ama halkii ma jirin wax shati ah, marka laga reebo rabitaanka README: qoraagu ma bixiyo dammaanad, magaca qoraaga lama tirtiri karo, barnaamijkana waxaa lagu iibin karaa oo keliya iyadoo wadata code code. Shuruudahani waxay noqdeen kuwo la jaan qaadaya mabaadi'da software-ka bilaashka ah ee caan ka helay sannadahaas, sidaas darteed qaar ka mid ah qaybinta Linux ee muhiimka ah ee ka soo muuqday horraantii 90-meeyadii waxay qaateen Vixie cron oo ah nidaamkooda mid welina sii kordhaya maanta.

Gaar ahaan, Koofiyadaha Cas iyo SUSE waxay horumariyaan fargeeto Vixie cron - cronie, iyo Debian iyo Ubuntu waxay adeegsadaan daabacaadda asalka ah ee Vixie cron oo leh balastar badan.

Aan marka hore barano crontab utility user ee lagu qeexay POSIX, ka dib waxaan eegi doonaa kordhinta syntax ee lagu bixiyo Vixie cron iyo isticmaalka kala duwanaanshaha Vixie cron ee qaybinta caanka ah ee Linux. Ugu dambeyntiina, cherry on cake waa falanqaynta qalabka cron daemon.

POSIX crontab

Haddii cron-ka asalka ah uu had iyo jeer u shaqeeyo superuser, jadwalka casriga ah ayaa inta badan wax ka qabta hawlaha isticmaalayaasha caadiga ah, taas oo ah mid ammaan ah oo ku habboon.

Crons waxaa loo bixiyaa sidii laba barnaamij oo kala duwan: cron daemon-ka joogtada ah iyo utility crontab ee ay heli karaan isticmaalayaasha. Midka dambe wuxuu kuu ogolaanayaa inaad wax ka beddesho miisaska shaqada ee u gaarka ah isticmaale kasta oo nidaamka ku jira, halka daemon-ku uu hawlihiisa ka bilaabo isticmaaleyaasha iyo miisaska nidaamka.

В Heerka POSIX habdhaqanka daemon laguma sifayn sinaba oo kaliya barnaamijka isticmaalaha ayaa si rasmi ah loo qaabeeyey crontab. Jiritaanka hababka lagu bilaabayo hawlaha isticmaalaha, dabcan, waa la maldahan yahay, laakiin aan si faahfaahsan loo sharaxin.

Markaad wacdo utility crontab, waxaad samayn kartaa afar shay: tafatir miiska hawsha isticmaalaha ee tifaftiraha, ka soo rar miiska faylka, tus miiska hawsha hadda, oo nadiifi miiska hawsha. Tusaalooyinka sida utility crontab u shaqeeyo:

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

Marka loo yeero crontab -e tifaftiraha ku qeexan doorsoomaha deegaanka caadiga ah ayaa la isticmaali doonaa EDITOR.

Hawlaha laftooda waxaa lagu sifeeyay qaabkan soo socda:

# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /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

Shanta goobood ee ugu horreeya diiwaanka: daqiiqo [1..60], saacadood [0..23], maalmood ee bisha [1..31], bilood [1..12], maalmaha toddobaadka [0. .6], halkaasoo 0 ay tahay Axadda. Ka ugu dambeeya, lixaad, goobta waa xariiq uu fulin doono turjubaanka taliska caadiga ah.

Shanta goobood ee ugu horreeya, qiyamka waxaa lagu qori karaa hakadyo:

# задача, выполняемая в первую и десятую минуты каждого часа
1,10 * * * * /path/to/exec -a -b -c

Ama si ji-dheer:

# задача, выполняемая в каждую из первых десяти минут каждого часа
0-9 * * * * /path/to/exec -a -b -c

Isticmaalaha gelitaanka jadwalka hawsha waxaa lagu nidaamiyaa POSIX cron.allow iyo cron.deny faylasha, kuwaas oo taxaya isticmaalayaasha gelitaanka crontab iyo isticmaalayaasha iyada oo aan marin barnaamijka, siday u kala horreeyaan. Halbeeggu sinaba uma nidaamiyo meesha faylalkaas yaallaan.

Marka loo eego heerka, ugu yaraan afar doorsoomayaasha deegaanka waa in loo gudbiyaa barnaamijyada la bilaabay:

  1. GURIGA - tusaha guriga isticmaalaha.
  2. LOGNAME - soo gal isticmaale
  3. PATH waa jidka aad ka heli karto adeegyada nidaamka caadiga ah.
  4. SHELL - dariiqa loo maro turjumaanka amarka ee la isticmaalay.

Waxaa xusid mudan, POSIX waxba kama sheegin halka qiyamka doorsoomayaashani ay ka yimaadeen.

Iibiyaha ugu fiican - Vixie cron 3.0pl1

Awoowaha guud ee noocyada caanka ah ee cron waa Vixie cron 3.0pl1, oo lagu soo bandhigay liiska boostada comp.sources.unix 1992. Waxaan si faahfaahsan uga fiirsan doonaa sifooyinka ugu muhiimsan ee noocaan.

Vixie cron wuxuu ku yimaadaa laba barnaamij (cron iyo crontab). Sida caadiga ah, daemon-ku wuxuu mas'uul ka yahay akhrinta iyo socodsiinta hawlaha laga soo bilaabo miiska hawsha nidaamka iyo miisaska hawlqabadka isticmaalaha shakhsi ahaaneed, iyo utility crontab ayaa mas'uul ka ah tafatirka miisaska isticmaalaha.

Miiska shaqada iyo faylalka habaynta

Shaxda shaqada superuser waxay ku taal /etc/crontab. Syntax ee shaxda nidaamku waxay u dhigantaa ereyga Vixie cron, marka laga reebo in tiirka lixaad ee ku jira uu tilmaamayo magaca isticmaalaha oo wakiilkiisa hawsha la bilaabay:

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

Jadwalka hawsha isticmaale ee joogtada ahi waxay ku yaalaan /var/cron/tabs/username oo isticmaal isla syntax. Markaad isticmaasho crontab utility ahaan isticmaale ahaan, kuwani waa faylasha la tafatiray.

Liisaska isticmaalayaasha ee marin u leh crontab waxaa lagu maareeyaa /var/cron/allow iyo/var/cron/diiri faylalka, halkaas oo aad u baahan tahay oo kaliya inaad geliso magaca isticmaale ee xariiq gooni ah.

Syntax fidsan

Marka la barbardhigo POSIX crontab, xalka Paul Vixey wuxuu ka kooban yahay dhowr isbeddel oo faa'iido leh oo ku saabsan jumlada miisaska hawsha utility.

Miis cusub ayaa la helay: tusaale ahaan, waxaad ku cayimi kartaa maalmaha toddobaadka ama bilaha magaca (Isniin, Talaado, iyo wixii la mid ah):

# Запускается ежеминутно по понедельникам и вторникам в январе
* * * Jan Mon,Tue /path/to/exec

Waxaad qeexi kartaa tallaabada loo marayo hawlaha la bilaabay:

# Запускается с шагом в две минуты
*/2 * * * Mon,Tue /path/to/exec

Tallaabooyinka iyo inta u dhexaysa waa la isku dari karaa:

# Запускается с шагом в две минуты в первых десять минут каждого часа
0-10/2 * * * * /path/to/exec

Beddelka macquulka ah ee beddelka ereyga caadiga ah waa la taageerayaa (dib u soo kabashada, sannadlaha, sannadlaha, bille, toddobaadle, maalinle, saqda dhexe, saacadle):

# Запускается после перезагрузки системы
@reboot /exec/on/reboot
# Запускается раз в день
@daily /exec/daily
# Запускается раз в час
@hourly /exec/daily

Deegaanka fulinta hawsha

Vixie cron wuxuu kuu ogolaanayaa inaad bedesho jawiga codsiyada socda.

Doorsoomayaasha deegaanka USER, LOGNAME iyo HOME si sahal ah uma bixiyo daemon, laakiin waxa laga soo qaatay fayl passwd. Doorsoomaha PATH waxa loo dejiyay "/ usr/bin:/bin" doorsoomaha SHELL waxa loo dejiyay "/ bin/sh". Qiimaha dhammaan doorsoomayaasha marka laga reebo LOGNAME waxa lagu beddeli karaa jaantusyada isticmaalaha.

Doorsoomayaasha deegaanka qaarkood (gaar ahaan SHELL iyo HOME) ayaa cron laftiisa u adeegsadaa si uu hawsha u wado. Waa kuwan waxa la isticmaalayo bash halkii laga isticmaali lahaa sh caadiga ah si loo socodsiiyo hawlaha gaarka ah waxay u ekaan karaan:

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

Ugu dambeyntii, dhammaan doorsoomayaasha deegaanka ee lagu qeexay shaxda (oo loo isticmaalo cron ama loo baahan yahay habraaca) ayaa loo gudbi doonaa hawsha socodsiinta.

Si loo tafatiro feylasha, crontab waxay isticmaashaa tafatiraha ku qeexan doorsoomiyaha deegaanka VISUAL ama EDITOR. Haddii deegaanka lagu maamulo crontab uusan lahayn doorsoomayaashan la qeexay, markaa "/ usr/ ucb/vi" ayaa la isticmaalaa (ucb malaha waa Jaamacadda California, Berkeley).

cron on Debian iyo Ubuntu

Soosaarayaasha Debian iyo qaybinta kala-soocida ayaa siidaayay nooca aadka loo bedelay Nooca Vixie cron 3.0pl1. Ma jiraan wax farqi ah oo u dhexeeya syntax ee faylasha miiska; isticmaalayaasha waa isku mid Vixie cron. Muuqaalka Cusub ee ugu Weyn: Taageerada syslog, SELinux и PAM.

Dareen yar, laakiin isbeddellada la taaban karo waxaa ka mid ah goobta faylalka habaynta iyo miisaska hawsha.

Jadwalka isticmaale ee Debian waxay ku yaalaan /var/spool/cron/crontabs directory, miiska nidaamka ayaa weli jira - gudaha /etc/crontab. Shaxda shaqada ee xirmada gaarka ah ee Debian waxaa la dhigayaa /etc/cron.d, halkaas oo cron daemon si toos ah u akhriyo. Xakamaynta gelitaanka isticmaalaha waxa gacanta ku haya faylasha /etc/cron.allow iyo /etc/cron.deny.

Qolofka caadiga ah ayaa weli ah / bin/sh, kaas oo Debian ku jira qolof yar oo POSIX u hoggaansan dumisaan, la bilaabay iyada oo aan la akhriyin wax qaabayn ah (hab aan is-dhexgal ahayn).

Cron lafteeda noocyadii ugu dambeeyay ee Debian waxaa lagu bilaabay habka systemd, iyo qaabeynta furitaanka waxaa laga arki karaa /lib/systemd/system/cron.service. Ma jiraan wax gaar ah oo ku jira habaynta adeegga; maamul hawleed kasta oo khiyaano leh ayaa lagu samayn karaa iyada oo loo marayo doorsoomayaasha deegaanka ee si toos ah loogu dhawaaqay crontab ee isticmaale kasta.

cronie on RedHat, Fedora iyo CentOS

gonie fargeeto ah nooca Vixie cron 4.1. Sida Debian, syntax isma beddelin, laakiin taageerada PAM iyo SELinux, oo ka shaqeynaya koox, faylalka raadraaca iyadoo la adeegsanayo inotify iyo astaamo kale ayaa lagu daray.

Qaabeynta caadiga ah waxay ku taal meelaha caadiga ah: miiska nidaamku wuxuu ku yaalaa /etc/crontab, baakadaha waxay ku dhejiyaan miisaska /etc/cron.d, miisaska isticmaalaha waxay galaan /var/spool/cron/crontabs.

Daemon-ku wuxuu hoos yimaadaa kontorool nidaamsan, qaabeynta adeeggu waa /lib/systemd/system/crond.service.

Qaybinta Koofiyada Cas, / bin/sh si caadi ah ayaa loo isticmaalaa bilowga, taas oo ah bash caadiga ah. Waa in la ogaadaa in marka ay ku socoto shaqooyinka cron via / bin / sh, qolofka bashku wuxuu ka bilaabmaa qaabka POSIX-ku-qabsoomidda oo ma akhriyo qaabeyn dheeraad ah, oo ku shaqeeya qaab aan is-dhexgal ahayn.

cronie gudaha SLES iyo openSUSE

Qaybinta jarmalka SLES iyo furaha ka soo jeeda ee OpenSUSE waxay adeegsadaan isla cronie. Daemon-ka halkan sidoo kale waxaa lagu bilaabay systemd, qaabeynta adeeggu wuxuu ku yaalaa /usr/lib/systemd/system/cron.service. Qaabeynta: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. / bin/sh waa isla bash ku socda POSIX-u hoggaansan habka aan is dhexgalka lahayn.

Qalabka Vixie cron

Farcanka casriga ah ee cron si weyn isuma beddelin marka loo eego Vixie cron, laakiin wali waxay heleen astaamo cusub oo aan loo baahnayn inay fahmaan mabaadi'da barnaamijka. Qaar badan oo ka mid ah kordhintan si liidata ayaa loo qaabeeyey oo waxay jahawareeriyeen koodka. Koodhka asalka ah ee cron ee Paul Vixey waa wax lagu farxo in la akhriyo.

Sidaa darteed, waxaan go'aansaday in aan falanqeeyo qalabka cron aniga oo isticmaalaya tusaale ahaan barnaamijka cron ee ka dhexeeya labada qaybood ee horumarinta - Vixie cron 3.0pl1. Waxaan fududeynayaa tusaalooyinka anigoo meesha ka saaraya ifdefs-ka adkeynaya akhrinta oo aan meesha ka saarayo tafaasiisha yaryar.

Shaqada jinnigu waxa loo qaybin karaa dhawr marxaladood:

  1. Bilowga barnaamijka.
  2. Ururinta iyo cusboonaysiinta liiska hawlaha la qabanayo.
  3. Loop-ka ugu weyn ee socda
  4. Bilow hawl.

Aynu u eegno siday u kala horreeyaan.

Bilowga

Marka la bilaabo, ka dib hubinta dooda habka, cron wuxuu rakibaa maamulayaasha SIGCHLD iyo SIGHUP. Midka kowaad wuxuu sameeyaa gal-gal log ah oo ku saabsan joojinta habsocodka ubadka, kan labaadna wuxuu xiraa sharraxaha faylka faylka log:

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

Daemon-ka 'cron daemon' had iyo jeer wuxuu ku shaqeeyaa kaligiis nidaamka, kaliya sida superuser iyo ka tusaha cron ee ugu weyn. Wicitaannada soo socda waxay abuuraan faylka quful PID ee habka daemon, hubi in isticmaaluhu sax yahay oo u beddel tusaha hadda kan ugu weyn:

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

Jidka caadiga ah ayaa la dejiyay, kaas oo la isticmaali doono marka la bilaabayo hababka:

setenv("PATH", _PATH_DEFPATH, 1);

Kadibna habka waa la "daemonized": waxay abuurtaa nuqul ilmo oo habka iyadoo wacaysa fargeeto iyo fadhi cusub oo habka ilmaha ah (wacaaya setsid). Habka waalidka looma baahna, oo wuu baxaa:

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

Joojinta nidaamka waalidku waxay siidaayaan qufulka faylka qufulka. Intaa waxaa dheer, waxaa loo baahan yahay in loo cusboonaysiiyo PID-ga faylka ku jira ilmaha. Taas ka dib, xogta hawsha waxaa la buuxinayaa:

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

/* Заполнение БД  */
database.head = NULL;
database.tail = NULL;
database.mtime = (time_t) 0;
load_database(&database);

Kadib cron wuxuu u dhaqaaqaa wareegga shaqada ee ugu weyn. Laakiin intaa ka hor, waxaa habboon in la eego soo dejinta liiska hawsha.

Ururinta iyo cusboonaysiinta liiska hawsha

Shaqada load_database ayaa mas'uul ka ah soo dejinta liiska hawlaha. Waxay hubisaa nidaamka crontab ee ugu muhiimsan iyo tusaha galka isticmaalaha. Haddii faylalka iyo hagaha aanay isbeddelin, liiska hawsha dib looma akhrin. Haddii kale, liis cusub oo hawlo ayaa bilaabmaya inuu sameeyo.

Soo dejinta faylka nidaamka leh faylal gaar ah iyo magacyo miiska:

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

Ku rarida miisaska isticmaalaha ee loop:

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

Taas ka dib kaydkii hore ayaa lagu bedelayaa mid cusub.

Tusaalooyinka kore, habka_crontab wicida shaqada waxay xaqiijisaa in isticmaale la mid ah magaca faylka miiska uu jiro (haddii aysan ahayn superuser) ka dibna wac load_user. Ka dambe wuxuu horey u akhriyay faylka laftiisa xariiq ahaan:

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

Halkan, ama doorsoomayaasha deegaanka ayaa la dejiyaa (khadadka foomka VAR = qiimaha) iyadoo la adeegsanayo load_env / env_set function, ama sharaxaadda hawsha waa la akhriyaa (* * * * * / dariiqa/to/exec) iyadoo la adeegsanayo hawsha load_entry.

Qaybta gelitaanka ee load_entry soo celiso waa hawshayada, taas oo lagu meeleeyay liiska guud ee hawlaha. Shaqada lafteedu waxay fulisaa falanqeyn afka ah oo ku saabsan qaabka waqtiga, laakiin waxaan aad u xiisayneynaa sameynta doorsoomayaasha deegaanka iyo cabirrada bilowga hawsha:

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

Wareegga ugu weyni wuxuu la shaqeeyaa liiska hawlaha hadda jira.

Loop ugu weyn

Cron-ka asalka ah ee Version 7 Unix wuxuu u shaqeeyay si fudud: wuxuu dib u akhriyay qaabeynta wareegga, wuxuu bilaabay hawlaha daqiiqadaha hadda jira sidii superuser, wuxuuna seexday ilaa bilawga daqiiqada soo socota. Habkan fudud ee mashiinada hore ayaa u baahday ilo badan.

Nooc kale ayaa lagu soo jeediyay SysV, kaas oo daemonku uu seexday ilaa daqiiqada ugu dhow ee hawsha loo qeexay, ama 30 daqiiqo. Khayraad yar ayaa loo isticmaalay dib u akhrinta qaabaynta iyo hubinta hawlaha qaabkan, laakiin si dhakhso ah cusboonaysiinta liiska hawlaha waxay noqotay mid aan haboonayn.

Vixie cron wuxuu ku soo noqday hubinta liisaska hawsha hal mar daqiiqadii, nasiib wanaag dhamaadkii 80-meeyadii waxaa jiray ilo aad u badan oo ku saabsan mashiinada Unix caadiga ah:

/* первичная загрузка задач */
load_database(&database);
/* запустить задачи, поставленные к выполнению после перезагрузки системы */
run_reboot_jobs(&database);
/* сделать TargetTime началом ближайшей минуты */
cron_sync();
while (TRUE) {
    /* выполнить задачи, после чего спать до TargetTime с поправкой на время, потраченное на задачи */
    cron_sleep();

    /* перечитать конфигурацию */
    load_database(&database);

    /* собрать задачи для данной минуты */
    cron_tick(&database);

    /* перевести TargetTime на начало следующей минуты */
    TargetTime += 60;
}

Shaqada cron_sleep waxay si toos ah ugu lug leedahay fulinta hawlaha, adoo wacaya job_runqueue (tiro oo socodsii hawlaha) iyo samayn_command (ku socodsii hawl kasta oo gaar ah). Shaqada ugu dambeysa waxay mudan tahay in si faahfaahsan loo baaro.

Qabashada hawl

Shaqada do_command waxaa loo fuliyaa qaab Unix wanaagsan, taas oo ah, waxay qabataa fargeeto si ay hawsha u qabato si isku mid ah. Habka waalidku wuxuu sii wadaa inuu bilaabo hawlaha, nidaamka ilmahu wuxuu diyaariyaa habka hawsha:

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

Waxaa jira caqli badan oo ku jira habka child_process: waxay qaadataa wax soo saar caadi ah iyo qulqulka qaladka laftiisa, si markaas loogu diro boostada (haddii beddelka deegaanka MAILTO lagu qeexo miiska shaqada), iyo, ugu dambeyntii, waxay sugtaa tan ugu weyn. habka hawsha loo dhamaystirayo.

Habka hawsha waxaa sameeyay fargeeto kale:

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

Taasi asal ahaan waa cron oo dhan. Waxaan ka tagay qaar ka mid ah faahfaahinta xiisaha leh, tusaale ahaan, xisaabinta isticmaalayaasha fog, laakiin waxaan qeexay waxa ugu muhiimsan.

Kadib

Cron waa barnaamij la yaab leh oo fudud oo faa'iido leh, oo lagu sameeyay caadooyinka ugu fiican adduunka Unix. Wax dheeraad ah ma qabato, laakiin waxay shaqadeeda si cajiib ah u qabanaysay dhawr iyo toban sano hadda. Helitaanka koodka nooca la socda Ubuntu ma qaadan wax ka badan saacad, waxaanan lahaa madadaalo badan! Waxaan rajeynayaa inaan awooday inaan kula wadaago.

Ma garanayo adiga, laakiin waxaan ka xumahay in aan ogaado in barnaamijyada casriga ah, oo leh u janjeera in ay noqdaan kuwo aad u adag oo aan la taaban karin, ma aha kuwo ku haboon fududeyntan muddo dheer.

Waxaa jira beddelaadyo badan oo casri ah oo loo beddelo cron: systemd-timers waxay kuu oggolaanayaan inaad habayso nidaamyo adag oo ku-tiirsanaan leh, fcron waxay kuu oggolaaneysaa inaad si dabacsanaan leh u maamusho isticmaalka kheyraadka ee howlaha. Laakiin shakhsi ahaan, crontab ugu fudud ayaa had iyo jeer igu filan.

Marka la soo koobo, jeclow Unix, isticmaal barnaamijyo fudud oo ha ilaawin inaad akhrido manaabadaada!

Source: www.habr.com

Add a comment