Cron sa Linux: kasaysayan, paggamit ug device

Cron sa Linux: kasaysayan, paggamit ug device

Ang klasiko misulat nga ang malipayong mga oras dili motan-aw. Niadtong ihalas nga mga panahon walay mga programmer o Unix, apan karon ang mga programmer sigurado nga nahibal-an: ang cron magsubay sa oras imbes kanila.

Ang mga utilities sa command line usa ka kahuyang ug usa ka buluhaton alang kanako. sed, awk, wc, cut ug uban pang daan nga mga programa gipadagan sa mga script sa among mga server kada adlaw. Daghan niini gidesinyo isip mga buluhaton alang sa cron, usa ka scheduler nga orihinal gikan sa 70s.

Sulod sa dugay nga panahon gigamit nako ang cron sa taphaw, nga wala moadto sa mga detalye, apan usa ka adlaw, sa dihang nakasugat ako og sayup sa pagpadagan sa usa ka script, nakahukom ko nga susihon kini pag-ayo. Ingon niini kung giunsa kini nga artikulo nagpakita, samtang nagsulat niini nahibal-an nako ang POSIX crontab, ang panguna nga kapilian sa cron sa mga sikat nga distribusyon sa Linux ug ang istruktura sa pipila niini.

Gigamit ba nimo ang Linux ug nagpadagan sa mga buluhaton sa cron? Interesado ka ba sa arkitektura sa aplikasyon sa sistema sa Unix? Unya padung na mi!

Mga sulod

Sinugdanan sa species

Ang regular nga pagpatuman sa mga programa sa user o sistema usa ka klaro nga kinahanglanon sa tanan nga mga operating system. Busa, ang mga programmer nakaamgo sa panginahanglan alang sa mga serbisyo nga nagtugot kanila sa sentral nga pagplano ug pagpatuman sa mga buluhaton sa dugay na nga panahon.

Ang sama sa Unix nga mga operating system nagsubay sa ilang mga gigikanan balik sa Bersyon 7 Unix, naugmad sa 70s sa miaging siglo sa Bell Labs, lakip na sa sikat nga Ken Thompson. Ang Bersyon 7 Unix naglakip usab sa cron, usa ka serbisyo alang sa kanunay nga pagpadagan sa mga buluhaton sa superuser.

Ang usa ka tipikal nga modernong cron usa ka yano nga programa, apan ang operating algorithm sa orihinal nga bersyon mas simple: ang serbisyo nagmata kausa sa usa ka minuto, nagbasa usa ka lamesa nga adunay mga buluhaton gikan sa usa ka file (/etc/lib/crontab) ug gihimo alang sa superuser kadtong mga buluhaton nga angay untang himoon sa kasamtangang higayon.

Pagkahuman, ang gipaayo nga mga bersyon sa yano ug mapuslanon nga serbisyo gihatag sa tanan nga mga operating system nga sama sa Unix.

Kinatibuk-ang paghubit sa format sa crontab ug ang sukaranang mga prinsipyo sa operasyon sa utility gilakip sa nag-unang sumbanan sa mga operating system nga sama sa Unix - POSIX - niadtong 1992, ug busa ang cron gikan sa de facto nga sumbanan nahimong de jure standard.

Sa 1987, si Paul Vixie, nga nag-survey sa mga tiggamit sa Unix bahin sa ilang gusto alang sa cron, nagpagawas sa laing bersyon sa daemon nga nagtul-id sa pipila ka mga problema sa tradisyonal nga cron ug nagpalapad sa syntax sa mga file sa lamesa.

Sa ikatulo nga bersyon sa Vixie cron nagsugod sa pagtagbo sa mga kinahanglanon sa POSIX, dugang pa, ang programa adunay usa ka liberal nga lisensya, o hinoon wala'y lisensya sa tanan, gawas sa mga pangandoy sa README: ang tagsulat wala maghatag garantiya, ang ngalan sa tagsulat dili mapapas, ug ang programa mabaligya lamang uban sa source code. Kini nga mga kinahanglanon nahimo nga nahiuyon sa mga prinsipyo sa libre nga software nga nakakuha sa pagkapopular sa mga tuig, mao nga ang pipila sa mga yawe nga pag-apod-apod sa Linux nga nagpakita sa sayong bahin sa 90s mikuha sa Vixie cron isip ilang sistema ug gipauswag pa kini karon.

Sa partikular, ang Red Hat ug SUSE nagpalambo sa usa ka tinidor sa Vixie cron - cronie, ug gigamit ni Debian ug Ubuntu ang orihinal nga edisyon sa Vixie cron nga adunay daghang mga patch.

Atong una nga pamilyar sa user utility crontab nga gihulagway sa POSIX, pagkahuman atong tan-awon ang mga extension sa syntax nga gihatag sa Vixie cron ug ang paggamit sa mga variation sa Vixie cron sa mga sikat nga distribusyon sa Linux. Ug sa katapusan, ang cherry sa cake mao ang pagtuki sa cron daemon device.

POSIX crontab

Kung ang orihinal nga cron kanunay nga nagtrabaho alang sa superuser, ang mga modernong scheduler kanunay nga nag-atubang sa mga buluhaton sa ordinaryong mga tiggamit, nga labi ka luwas ug kombenyente.

Ang mga crons gihatag isip usa ka set sa duha ka mga programa: ang kanunay nga nagdagan nga cron daemon ug ang crontab utility nga magamit sa mga tiggamit. Ang ulahi nagtugot kanimo sa pag-edit sa mga lamesa sa buluhaton nga espesipiko sa matag tiggamit sa sistema, samtang ang daemon naglansad sa mga buluhaton gikan sa mga lamesa sa tiggamit ug sistema.

В POSIX nga sumbanan ang kinaiya sa daemon wala gihulagway sa bisan unsang paagi ug ang programa sa tiggamit lamang ang pormal crontab. Ang paglungtad sa mga mekanismo alang sa paglansad sa mga buluhaton sa tiggamit, siyempre, gipasabut, apan wala gihulagway sa detalye.

Pinaagi sa pagtawag sa crontab utility, mahimo nimo ang upat ka butang: i-edit ang task table sa user sa editor, i-load ang table gikan sa file, ipakita ang kasamtangan nga task table, ug hawanan ang task table. Mga pananglitan kung giunsa ang paggamit sa crontab:

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

Sa dihang nanawag crontab -e gamiton ang editor nga gitakda sa standard environment variable EDITOR.

Ang mga buluhaton mismo gihulagway sa mosunod nga pormat:

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

Ang unang lima ka field sa mga rekord: minuto [1..60], oras [0..23], mga adlaw sa bulan [1..31], mga bulan [1..12], mga adlaw sa semana [0. .6], diin ang 0 mao ang Domingo. Ang katapusan, ikaunom, nga field usa ka linya nga ipatuman sa standard command interpreter.

Sa una nga lima ka mga natad, ang mga kantidad mahimong ilista nga gibulag sa mga koma:

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

O gamit ang hyphen:

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

Ang pag-access sa user sa pag-iskedyul sa buluhaton gi-regulate sa POSIX pinaagi sa cron.allow ug cron.deny nga mga file, nga naglista sa mga tiggamit nga adunay access sa crontab ug mga tiggamit nga walay access sa programa, matag usa. Ang sumbanan wala mag-regulate sa lokasyon niini nga mga file sa bisan unsang paagi.

Sumala sa sumbanan, labing menos upat ka mga variable sa palibot ang kinahanglan nga ipasa sa gilunsad nga mga programa:

  1. HOME - direktoryo sa balay sa user.
  2. LOGNAME — user login.
  3. Ang PATH mao ang dalan diin makit-an nimo ang standard nga mga utilities sa sistema.
  4. SHELL — dalan paingon sa gigamit nga command interpreter.

Talagsaon, wala’y gisulti ang POSIX kung diin gikan ang mga kantidad alang sa kini nga mga variable.

Labing maayo nga namaligya - Vixie cron 3.0pl1

Ang kasagarang katigulangan sa sikat nga mga variant sa cron mao ang Vixie cron 3.0pl1, nga gipaila sa comp.sources.unix mailing list niadtong 1992. Atong hisgotan ang mga nag-unang bahin niini nga bersyon sa mas detalyado.

Ang Vixie cron moabut sa duha ka mga programa (cron ug crontab). Sama sa naandan, ang daemon maoy responsable sa pagbasa ug pagpadagan sa mga buluhaton gikan sa system task table ug indibidwal nga user task table, ug ang crontab utility maoy responsable sa pag-edit sa user tables.

Talaan sa buluhaton ug mga file sa pag-configure

Ang superuser task table nahimutang sa /etc/crontab. Ang syntax sa system table katumbas sa syntax sa Vixie cron, gawas nga ang ikaunom nga kolum niini nagpaila sa ngalan sa user sa ilalum kang kinsang ngalan gilunsad ang buluhaton:

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

Ang regular nga user task tables nahimutang sa /var/cron/tabs/username ug naggamit sa samang syntax. Kung gipadagan nimo ang crontab utility ingon usa ka tiggamit, kini ang mga file nga gi-edit.

Ang mga lista sa mga tiggamit nga adunay access sa crontab gidumala sa /var/cron/allow ug /var/cron/deny nga mga file, diin kinahanglan nimo nga isulod ang user name sa lahi nga linya.

Gipadako nga syntax

Kung itandi sa POSIX crontab, ang solusyon ni Paul Vixey adunay daghang mapuslanon nga mga pagbag-o sa syntax sa mga lamesa sa buluhaton sa utility.

Usa ka bag-ong table syntax ang nahimong magamit: pananglitan, mahimo nimong itakda ang mga adlaw sa semana o mga bulan pinaagi sa ngalan (Mon, Mar, ug uban pa):

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

Mahimo nimong ipiho ang lakang diin ang mga buluhaton gilunsad:

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

Ang mga lakang ug mga agwat mahimong isagol:

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

Ang intuitive nga mga alternatibo sa naandan nga syntax gisuportahan (pag-reboot, kada tuig, kada tuig, binulan, kada semana, adlaw-adlaw, tungang gabii, kada oras):

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

Kalibotan sa pagpatuman sa buluhaton

Gitugotan ka sa Vixie cron nga usbon ang palibot sa mga nagdagan nga aplikasyon.

Ang mga variable sa palibot USER, LOGNAME ug HOME dili lang gihatag sa daemon, apan gikuha gikan sa usa ka file. passwd. Ang PATH variable gibutang sa "/ usr / bin: / bin" ug ang SHELL variable gibutang sa "/ bin / sh". Ang mga kantidad sa tanan nga mga variable gawas sa LOGNAME mahimong usbon sa mga lamesa sa gumagamit.

Ang pipila ka mga variable sa palibot (labi na ang SHELL ug HOME) gigamit sa cron mismo sa pagpadagan sa buluhaton. Ania kung unsa ang hitsura sa paggamit sa bash imbes sa standard sh aron magpadagan sa naandan nga mga buluhaton:

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

Sa katapusan, ang tanan nga mga variable sa palibot nga gihubit sa lamesa (gigamit sa cron o gikinahanglan sa proseso) ipasa sa nagdagan nga buluhaton.

Sa pag-edit sa mga file, gigamit sa crontab ang editor nga gitakda sa VISUAL o EDITOR environment variable. Kung ang palibot diin ang crontab gipadagan wala kini nga mga variable nga gipasabut, nan ang "/usr/ucb/vi" gigamit (ucb tingali ang Unibersidad sa California, Berkeley).

cron sa Debian ug Ubuntu

Ang mga developers sa Debian ug derivative distributions gipagawas na kaayo giusab nga bersyon Vixie cron nga bersyon 3.0pl1. Walay mga kalainan sa syntax sa mga file sa lamesa; alang sa mga tiggamit kini mao ang sama nga Vixie cron. Labing Dako nga Bag-ong Feature: Suporta syslog, SELinux и Pam.

Dili kaayo mamatikdan, apan mahikap nga mga pagbag-o naglakip sa lokasyon sa mga file sa pag-configure ug mga lamesa sa buluhaton.

Ang mga lamesa sa tiggamit sa Debian nahimutang sa direktoryo nga /var/spool/cron/crontabs, ang lamesa sa sistema anaa gihapon - sa /etc/crontab. Debian package-specific task tables gibutang sa /etc/cron.d, diin ang cron daemon awtomatik nga nagbasa niini. Ang kontrol sa pag-access sa tiggamit kontrolado sa /etc/cron.allow ug /etc/cron.deny nga mga file.

Ang default nga kabhang mao gihapon ang /bin/sh, nga sa Debian usa ka gamay nga kabhang nga nagsunod sa POSIX dash, gilusad nga walay pagbasa sa bisan unsang configuration (sa non-interactive mode).

Ang Cron mismo sa pinakabag-o nga mga bersyon sa Debian gilunsad pinaagi sa systemd, ug ang configuration sa paglunsad mahimong makita sa /lib/systemd/system/cron.service. Wala’y espesyal sa pag-configure sa serbisyo; ang bisan unsang labi ka maliputon nga pagdumala sa buluhaton mahimo’g pinaagi sa mga variable sa palibot nga gipahayag direkta sa crontab sa matag tiggamit.

cronie sa RedHat, Fedora ug CentOS

cronie - tinidor sa Vixie cron nga bersyon 4.1. Sama sa Debian, ang syntax wala mausab, apan ang suporta alang sa PAM ug SELinux, nagtrabaho sa usa ka cluster, pagsubay sa mga file gamit ang inotify ug uban pang mga bahin gidugang.

Ang default configuration anaa sa naandan nga mga dapit: ang system table anaa sa /etc/crontab, ang mga package nagbutang sa ilang mga lamesa sa /etc/cron.d, user tables adto sa /var/spool/cron/crontabs.

Ang daemon midagan ubos sa systemd control, ang service configuration mao ang /lib/systemd/system/crond.service.

Sa mga distribusyon nga sama sa Red Hat, ang /bin/sh gigamit nga default sa pagsugod, nga mao ang standard bash. Kinahanglan nga matikdan nga kung nagdagan ang mga trabaho sa cron pinaagi sa / bin / sh, ang bash shell magsugod sa POSIX-compliant mode ug wala magbasa sa bisan unsang dugang nga configuration, nga nagdagan sa non-interactive mode.

cronie sa SLES ug openSUSE

Ang German distribution nga SLES ug ang derivative nga openSUSE niini naggamit sa samang cronie. Ang daemon dinhi gilusad usab ubos sa systemd, ang configuration sa serbisyo nahimutang sa /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. Ang /bin/sh mao ra ang bash nga nagdagan sa POSIX-compliant non-interactive mode.

Vixie cron device

Ang modernong mga kaliwat sa cron wala kaayo mausab kon itandi sa Vixie cron, apan nakuha gihapon ang mga bag-ong bahin nga wala kinahanglana aron masabtan ang mga prinsipyo sa programa. Daghan niini nga mga extension ang dili maayo nga pagkadisenyo ug naglibog sa code. Ang orihinal nga cron source code ni Paul Vixey usa ka kalipay nga basahon.

Busa, nakahukom ko nga analisahon ang cron device gamit ang pananglitan sa usa ka cron program nga komon sa duha ka sanga sa kalamboan - Vixie cron 3.0pl1. Akong pasimplehon ang mga pananglitan pinaagi sa pagtangtang sa mga ifdef nga makapakomplikado sa pagbasa ug pagtangtang sa gagmay nga mga detalye.

Ang buhat sa demonyo mahimong bahinon sa daghang mga yugto:

  1. Pagsugod sa programa.
  2. Pagkolekta ug pag-update sa lista sa mga buluhaton nga pagdagan.
  3. Nagdagan ang main cron loop.
  4. Pagsugod ug buluhaton.

Atong tan-awon sila sa han-ay.

Pasiuna

Kung nagsugod, pagkahuman sa pagsusi sa mga argumento sa proseso, gi-install sa cron ang SIGCHLD ug SIGHUP signal handler. Ang una naghimo og log entry mahitungod sa pagtapos sa proseso sa bata, ang ikaduha nagsira sa file descriptor sa log file:

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

Ang cron daemon kanunay nga nagdagan nga nag-inusara sa sistema, ingon usa ka superuser ug gikan sa panguna nga direktoryo sa cron. Ang mosunud nga mga tawag maghimo usa ka lock file nga adunay PID sa proseso sa daemon, siguruha nga husto ang tiggamit ug usba ang karon nga direktoryo sa panguna:

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

Ang default nga dalan gitakda, nga gamiton sa pagsugod sa mga proseso:

setenv("PATH", _PATH_DEFPATH, 1);

Dayon ang proseso kay "daemonized": nagmugna kini og kopya sa bata sa proseso pinaagi sa pagtawag sa fork ug bag-ong sesyon sa proseso sa bata (pagtawag og setsid). Ang proseso sa ginikanan dili na kinahanglan, ug kini mogawas:

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

Ang pagtapos sa proseso sa ginikanan nagpagawas sa lock sa lock file. Dugang pa, gikinahanglan nga i-update ang PID sa file ngadto sa bata. Pagkahuman niini, ang database sa buluhaton napuno sa:

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

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

Unya ang cron nagpadayon sa panguna nga siklo sa trabaho. Apan sa wala pa kana, angay nga tan-awon ang pagkarga sa lista sa buluhaton.

Pagkolekta ug pag-update sa lista sa buluhaton

Ang function sa load_database maoy responsable sa pagkarga sa listahan sa mga buluhaton. Gisusi niini ang main system crontab ug ang direktoryo nga adunay mga file sa gumagamit. Kung ang mga file ug direktoryo wala mausab, ang listahan sa buluhaton dili basahon pag-usab. Kung dili, usa ka bag-ong lista sa mga buluhaton magsugod sa pagporma.

Pag-load sa usa ka system file nga adunay espesyal nga file ug mga ngalan sa lamesa:

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

Nag-load sa mga lamesa sa tiggamit sa usa ka 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);
}

Pagkahuman ang daan nga database gipulihan sa usa ka bag-o.

Sa mga pananglitan sa ibabaw, ang process_crontab function call nagpamatuod nga ang usa ka user nga katumbas sa table file name anaa (gawas kon kini usa ka superuser) ug unya motawag sa load_user. Gibasa na sa ulahi ang file mismo sa linya sa linya:

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

Dinhi, ang environment variable gitakda (mga linya sa porma nga VAR=value) gamit ang load_env / env_set functions, o ang task description gibasa (* * * * * /path/to/exec) gamit ang load_entry function.

Ang entry entity nga ibalik sa load_entry mao ang among buluhaton, nga gibutang sa kinatibuk-ang listahan sa mga buluhaton. Ang function mismo nagdala sa usa ka verbose parsing sa format sa oras, apan mas interesado kami sa pagporma sa mga variable sa palibot ug mga parameter sa paglansad sa buluhaton:

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

Ang nag-unang loop nagtrabaho uban sa kasamtangan nga listahan sa mga buluhaton.

Panguna nga Loop

Ang orihinal nga cron gikan sa Bersyon 7 Unix nagtrabaho nga yano: gibasa pag-usab ang pagsumpo sa usa ka loop, gilunsad ang mga buluhaton sa karon nga minuto ingon usa ka superuser, ug natulog hangtod sa pagsugod sa sunod nga minuto. Kining yano nga pamaagi sa mga daan nga makina nanginahanglan daghang mga kapanguhaan.

Usa ka alternatibo nga bersyon ang gisugyot sa SysV, diin ang daemon natulog bisan hangtod sa labing duol nga minuto diin ang buluhaton gihubit, o sa 30 minuto. Diyutay nga mga kapanguhaan ang nahurot alang sa pag-usab sa pagbasa sa pagsumpo ug pagsusi sa mga buluhaton sa kini nga mode, apan ang dali nga pag-update sa lista sa mga buluhaton nahimong dili kombenyente.

Si Vixie cron mibalik sa pagsusi sa mga lista sa buluhaton kausa sa usa ka minuto, maayo na lang sa katapusan sa 80s adunay mas daghang kapanguhaan sa standard nga Unix machines:

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

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

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

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

Ang cron_sleep function direktang nalangkit sa pagpatuman sa mga buluhaton, nga nagtawag sa job_runqueue (enumerate and run tasks) ug do_command (run matag indibidwal nga buluhaton) functions. Ang katapusan nga function mao ang bili sa pagsusi sa mas detalye.

Pagdagan sa usa ka buluhaton

Ang do_command function gipatuman sa maayo nga Unix nga estilo, nga mao, kini naghimo sa usa ka tinidor sa pagbuhat sa buluhaton asynchronously. Ang proseso sa ginikanan nagpadayon sa paglansad sa mga buluhaton, ang proseso sa bata nag-andam sa proseso sa buluhaton:

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

Adunay daghan nga lohika sa child_process: nagkinahanglan kini og standard nga output ug error streams ngadto sa iyang kaugalingon, aron ipadala kini ngadto sa mail (kung ang MAILTO environment variable gipiho sa task table), ug, sa katapusan, naghulat alang sa nag-unang proseso sa buluhaton aron makompleto.

Ang proseso sa buluhaton naporma sa laing tinidor:

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

Mao ra kana ang tanan nga cron. Gilaktawan nako ang pipila ka makapaikag nga mga detalye, pananglitan, pag-asoy sa mga hilit nga tiggamit, apan gilatid nako ang panguna nga butang.

Pagkahuman

Ang Cron usa ka katingad-an nga yano ug mapuslanon nga programa, nga gihimo sa labing kaayo nga mga tradisyon sa Unix nga kalibutan. Wala siyay gibuhat nga sobra, apan nahimo na niya ang iyang trabaho nga talagsaon sa daghang mga dekada na karon. Ang pagkuha sa code alang sa bersyon nga kauban sa Ubuntu wala molapas sa usa ka oras, ug nalingaw kaayo ako! Nanghinaut ko nga napaambit ko kini kanimo.

Wala ko kaila nimo, pero medyo nasubo ko nga nakaamgo nga ang modernong programming, uban ang kalagmitan niini nga sobra ka komplikado ug sobra ka abstract, wala pa makaayo sa ingon nga kayano sa dugay nga panahon.

Adunay daghang mga modernong alternatibo sa cron: ang mga systemd-timer nagtugot kanimo sa pag-organisar sa mga komplikadong sistema nga adunay mga dependency, ang fcron nagtugot kanimo nga mas dali nga makontrol ang pagkonsumo sa kapanguhaan pinaagi sa mga buluhaton. Apan sa personal, ang pinakasimple nga crontab kanunay nga igo alang kanako.

Sa laktud, higugmaa ang Unix, gamita ang yano nga mga programa ug ayaw kalimti ang pagbasa sa mana alang sa imong plataporma!

Source: www.habr.com

Idugang sa usa ka comment