Cron a cikin Linux: tarihi, amfani da na'ura

Cron a cikin Linux: tarihi, amfani da na'ura

Classic ya rubuta cewa sa'o'i masu farin ciki ba sa kallo. A waɗancan lokatai daji babu masu shirye-shirye ko Unix, amma a yau masu shirye-shirye sun san tabbas: cron zai kiyaye lokaci maimakon su.

Abubuwan amfani da layin umarni duka rauni ne da wahala a gare ni. sed, awk, wc, cut da sauran tsofaffin shirye-shirye ana gudanar da su ta hanyar rubutun akan sabar mu kowace rana. Yawancin su an tsara su azaman ayyuka don cron, mai tsara jadawalin asali daga 70s.

Na dade ina amfani da cron sama-sama, ba tare da yin cikakken bayani ba, amma wata rana, lokacin da na ci karo da kuskure lokacin gudanar da rubutun, na yanke shawarar bincika shi sosai. Wannan shine yadda wannan labarin ya bayyana, yayin rubuta shi na saba da POSIX crontab, manyan zaɓuɓɓukan cron a cikin shahararrun rarraba Linux da tsarin wasu daga cikinsu.

Kuna amfani da Linux kuma kuna gudanar da ayyukan cron? Shin kuna sha'awar gine-ginen aikace-aikacen tsarin a cikin Unix? Sannan muna kan hanya!

Abubuwa

Asalin jinsin

Yin kisa na lokaci-lokaci na mai amfani ko shirye-shiryen tsarin wata buƙatu ce ta zahiri a duk tsarin aiki. Saboda haka, masu shirye-shirye sun fahimci buƙatar ayyukan da ke ba su damar tsarawa da aiwatar da ayyuka da dadewa.

Tsarukan aiki irin na Unix sun gano asalinsu zuwa Shafin 7 Unix, wanda aka haɓaka a cikin 70s na ƙarni na ƙarshe a Bell Labs, gami da sanannen Ken Thompson. Sigar 7 Unix kuma ta haɗa da cron, sabis don gudanar da ayyuka na yau da kullun.

Tsarin cron na yau da kullun shiri ne mai sauƙi, amma algorithm aiki na sigar asali ya fi sauƙi: sabis ɗin ya tashi sau ɗaya a minti ɗaya, karanta tebur tare da ayyuka daga fayil guda (/etc/lib/crontab) kuma an yi shi don mai sarrafa ayyukan da yakamata a yi a halin yanzu.

Daga baya, an kawo ingantattun nau'ikan sabis mai sauƙi da amfani tare da duk tsarin aiki kamar Unix.

Cikakken bayanin tsarin crontab da mahimman ka'idodin aikin mai amfani an haɗa su cikin babban ma'auni na tsarin aiki kamar Unix - POSIX - a cikin 1992, don haka cron daga ma'auni na de facto ya zama ma'auni na de jure.

A cikin 1987, Paul Vixie, bayan binciken masu amfani da Unix game da buri na cron, ya sake fitar da wani nau'in daemon wanda ya gyara wasu matsalolin cron na gargajiya kuma ya fadada tsarin fayilolin tebur.

Ta hanyar nau'i na uku na Vixie cron ya fara biyan bukatun POSIX, ban da haka, shirin yana da lasisi mai sassaucin ra'ayi, ko kuma babu wani lasisi kwata-kwata, sai dai ga buri a cikin README: marubucin bai ba da garanti ba, sunan marubucin. ba za a iya share, kuma shirin za a iya kawai sayar da tare da tushen code. Waɗannan buƙatun sun zama masu dacewa da ƙa'idodin software na kyauta waɗanda ke samun karɓuwa a waɗannan shekarun, don haka wasu mahimman rabe-raben Linux waɗanda suka bayyana a farkon 90s sun ɗauki Vixie cron a matsayin tsarin su ɗaya kuma har yanzu suna haɓaka shi a yau.

Musamman, Red Hat da SUSE suna haɓaka cokali mai yatsa na Vixie cron - cronie, kuma Debian da Ubuntu suna amfani da ainihin bugu na Vixie cron tare da faci da yawa.

Bari mu fara sanin crontab mai amfani mai amfani da aka bayyana a cikin POSIX, bayan haka za mu kalli kariyar haɗin gwiwar da aka bayar a cikin Vixie cron da kuma amfani da bambancin Vixie cron a cikin shahararrun rarraba Linux. Kuma a ƙarshe, ceri akan cake shine nazarin na'urar cron daemon.

POSIX crontab

Idan cron na asali koyaushe yana aiki don superuser, masu tsara tsarin zamani galibi suna magance ayyukan masu amfani na yau da kullun, wanda ya fi aminci da dacewa.

Ana ba da Crons azaman saitin shirye-shirye guda biyu: cron daemon da ke gudana koyaushe da kayan aikin crontab da ke akwai ga masu amfani. Ƙarshen yana ba ku damar shirya tebur na ɗawainiya musamman ga kowane mai amfani a cikin tsarin, yayin da daemon ya ƙaddamar da ayyuka daga masu amfani da tsarin tsarin.

В POSIX misali Ba a bayyana halin daemon ta kowace hanya ba kuma kawai shirin mai amfani ne kawai aka tsara crontab. Kasancewar hanyoyin ƙaddamar da ayyukan mai amfani, ba shakka, ana nunawa, amma ba a bayyana su dalla-dalla ba.

Ta hanyar kiran crontab utility, za ka iya yin abubuwa hudu: gyara tebur ɗawainiyar mai amfani a cikin edita, ɗora tebur daga fayil, nuna tebur na yanzu, da share teburin aiki. Misalan yadda mai amfani da crontab ke aiki:

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

Lokacin da aka kira crontab -e za a yi amfani da editan da aka kayyade a cikin madaidaicin yanayin yanayi EDITOR.

Ayyukan da kansu an kwatanta su a cikin tsari mai zuwa:

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

Filayen farko guda biyar na bayanan: mintuna [1..60], awanni [0..23], kwanakin wata [1..31], watanni [1..12], kwanakin mako [0. .6], inda 0 ke Lahadi. Na ƙarshe, na shida, filin layi ne wanda madaidaicin fassarar umarni zai aiwatar.

A cikin filaye biyar na farko, ana iya lissafin ƙima ta hanyar waƙafi:

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

Ko tare da sarƙaƙƙiya:

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

Ana yin amfani da damar mai amfani don tsara tsarin ɗawainiya a cikin POSIX ta cron.allow da cron.deny fayiloli, waɗanda ke lissafin masu amfani da damar yin amfani da crontab da masu amfani ba tare da samun damar shiga shirin ba, bi da bi. Ma'auni baya tsara wurin waɗannan fayilolin ta kowace hanya.

Bisa ga ma'auni, aƙalla masu canjin yanayi guda huɗu dole ne a wuce zuwa shirye-shiryen ƙaddamar da su:

  1. GIDA - kundin adireshin gida na mai amfani.
  2. LOGNAME - shiga mai amfani.
  3. PATH ita ce hanyar da za ku iya samun daidaitattun kayan aikin tsarin.
  4. SHELL - hanya zuwa mai fassarar umarni da aka yi amfani da shi.

Musamman ma, POSIX bai faɗi komai ba game da inda ƙimar waɗannan masu canji suka fito.

Mafi kyawun siyarwa - Vixie cron 3.0pl1

Maganin gama gari na shahararrun bambance-bambancen cron shine Vixie cron 3.0pl1, wanda aka gabatar a cikin comp.sources.unix jerin aikawasiku a cikin 1992. Za mu yi la'akari da babban fasali na wannan sigar daki-daki.

Vixie cron ya zo cikin shirye-shirye guda biyu (cron da crontab). Kamar yadda aka saba, daemon yana da alhakin karantawa da gudanar da ayyuka daga tebur aikin tsarin da tebur ɗawainiya na kowane mai amfani, kuma mai amfani da crontab yana da alhakin gyara tebur mai amfani.

Teburin aiki da fayilolin sanyi

Teburin aikin superuser yana cikin /etc/crontab. Rubutun tsarin tsarin ya dace da haɗin gwiwar Vixie cron, ban da cewa shafi na shida a cikinsa yana nuna sunan mai amfani wanda aka ƙaddamar da aikin a ƙarƙashinsa:

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

Teburan ɗawainiyar mai amfani na yau da kullun suna cikin /var/cron/tabs/sunan mai amfani kuma suna amfani da ma'auni iri ɗaya. Lokacin da kake gudanar da aikin crontab azaman mai amfani, waɗannan fayilolin da aka gyara.

Lissafin masu amfani da damar yin amfani da crontab ana sarrafa su a cikin /var/cron/ba da izini da /var/cron/musanin fayiloli,inda kawai kuna buƙatar shigar da sunan mai amfani a cikin wani layi daban.

Extended syntax

Idan aka kwatanta da POSIX crontab, maganin Paul Vixey ya ƙunshi gyare-gyare masu fa'ida da yawa ga ma'auni na teburin ayyukan mai amfani.

An sami sabon tsarin tsarin tebur: misali, zaku iya tantance kwanakin mako ko watanni da suna (Litinin, Talata, da sauransu):

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

Kuna iya ƙayyade matakin da aka ƙaddamar da ayyuka:

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

Ana iya haɗa matakai da tazara:

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

Ana goyan bayan zaɓin daɗaɗɗen madaidaicin madaidaicin ɗabi'a (sake yi, shekara-shekara, kowace shekara, kowane wata, mako-mako, yau da kullun, tsakar dare, sa'o'i):

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

Yanayin aiwatar da ayyuka

Vixie cron yana ba ku damar canza yanayin aikace-aikacen da ke gudana.

Masu canjin yanayi USER, LOGNAME da HOME ba kawai daemon ke bayarwa ba, amma ana ɗaukar su daga fayil passwd. An saita madaidaicin PATH zuwa "/ usr/bin:/bin" kuma an saita m SHELL zuwa "/ bin/sh". Ana iya canza ƙimar duk masu canji ban da LOGNAME a cikin tebur masu amfani.

Wasu masu canjin yanayi (musamman SHELL da HOME) cron kanta ke amfani dashi don gudanar da aikin. Ga abin da amfani da bash maimakon daidaitaccen sh don gudanar da ayyuka na al'ada zai yi kama da:

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

Daga ƙarshe, duk masu canjin yanayi da aka ayyana a cikin tebur (amfani da cron ko da ake buƙata ta hanyar aiwatarwa) za a wuce zuwa aikin da ke gudana.

Don shirya fayiloli, crontab yana amfani da editan da aka kayyade a cikin ma'auni na VISUAL ko EDITOR. Idan yanayin da ake gudanar da crontab ba shi da ma'anar waɗannan ma'auni, to ana amfani da "/ usr/ ucb/vi" (ucb tabbas Jami'ar California ne, Berkeley).

cron akan Debian da Ubuntu

Masu haɓaka Debian da rarrabawar abubuwan da aka samu sun fito sosai modified version Vixie cron 3.0pl1. Babu bambance-bambance a cikin rubutun fayilolin tebur; ga masu amfani shine Vixie cron iri ɗaya. Babban Sabon Siffa: Taimako syslog, SELinux и Pam.

Ƙananan abubuwan da ba a iya gani ba, amma canje-canje masu ma'ana sun haɗa da wurin fayilolin daidaitawa da tebur na ɗawainiya.

Teburan masu amfani a cikin Debian suna cikin /var/spool/cron/crontabs directory, teburin tsarin yana nan - a /etc/crontab. Ana sanya takamaiman tebur na fakitin Debian a /etc/cron.d, daga inda cron daemon ke karanta su ta atomatik. Fayilolin /etc/cron.allow da /etc/cron.deny suna sarrafa ikon samun damar mai amfani.

Tsohuwar harsashi har yanzu /bin/sh, wanda a cikin Debian ƙaramin harsashi ne na POSIX dash, ƙaddamarwa ba tare da karanta kowane tsari ba (a cikin yanayin da ba a haɗa shi ba).

Cron kanta a cikin sabbin nau'ikan Debian an ƙaddamar da shi ta hanyar systemd, kuma ana iya duba tsarin ƙaddamarwa a /lib/systemd/system/cron.service. Babu wani abu na musamman a cikin saitin sabis; duk wani ƙarin sarrafa ɗawainiya da dabara za a iya yi ta hanyar masu canjin yanayi da aka ayyana kai tsaye a cikin crontab na kowane mai amfani.

cronie akan RedHat, Fedora da CentOS

cronie cokali mai yatsa na Vixie cron 4.1. Kamar yadda yake a cikin Debian, haɗin gwiwar bai canza ba, amma goyon baya ga PAM da SELinux, aiki a cikin gungu, fayilolin bin diddigin ta amfani da inotify da sauran fasalulluka an ƙara su.

Tsarin tsoho yana cikin wuraren da aka saba: teburin tsarin yana cikin /etc/crontab, fakiti suna sanya teburinsu a /etc/cron.d, tebur masu amfani suna shiga /var/spool/cron/crontabs.

Daemon yana gudana ƙarƙashin tsarin sarrafawa, tsarin sabis shine /lib/systemd/system/crond.service.

Akan Rarraba-kamar Red Hat, / bin/sh ana amfani dashi ta tsohuwa a farawa, wanda shine daidaitaccen bash. Ya kamata a lura cewa lokacin da ake gudanar da ayyukan cron ta hanyar / bin / sh, harsashi bash yana farawa a cikin yanayin POSIX-compliant kuma baya karanta wani ƙarin saiti, yana gudana a cikin yanayin da ba tare da haɗin gwiwa ba.

cronie a cikin SLES da openSUSE

Rarraba SLES na Jamus da buɗewar sa na OpenSUSE suna amfani da cronie iri ɗaya. Ana kuma ƙaddamar da daemon a nan ƙarƙashin systemd, tsarin sabis ɗin yana cikin /usr/lib/systemd/system/cron.service. Kanfigareshan: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh shine bash iri ɗaya da ke gudana a cikin POSIX-compliant POSIX yanayin mara ma'amala.

Vixie cron na'urar

Zuriyar zamani na cron ba su canza sosai ba idan aka kwatanta da Vixie cron, amma har yanzu sun sami sababbin siffofi waɗanda ba a buƙatar fahimtar ka'idodin shirin. Yawancin waɗannan kari ba a tsara su da kyau kuma suna rikitar da lambar. Asalin lambar tushen cron ta Paul Vixey abin farin ciki ne don karantawa.

Sabili da haka, na yanke shawarar yin nazarin na'urar cron ta amfani da misalin shirin cron na kowa ga rassan ci gaba biyu - Vixie cron 3.0pl1. Zan sauƙaƙa misalan ta hanyar cire ɓangarorin da ke rikitar da karatu da barin ƙananan bayanai.

Ana iya raba aikin aljani zuwa matakai da yawa:

  1. Farkon shirin.
  2. Tattara da sabunta jerin ayyukan da za a gudanar.
  3. Babban cron madauki yana gudana.
  4. Fara aiki.

Mu duba su cikin tsari.

Ƙaddamarwa

Lokacin da aka fara, bayan bincika gardamar tsari, cron yana shigar da masu sarrafa siginar SIGCHLD da SIGHUP. Na farko yana yin shigarwar log game da ƙarewar tsarin yaro, na biyu yana rufe bayanin fayil ɗin fayil ɗin log:

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

Cron daemon koyaushe yana gudana shi kaɗai akan tsarin, kawai a matsayin babban mai amfani da kuma daga babban kundin adireshi na cron. Kira masu zuwa suna ƙirƙirar fayil ɗin kulle tare da PID na tsarin daemon, tabbatar cewa mai amfani daidai kuma canza kundin adireshi na yanzu zuwa babba:

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

An saita tsohuwar hanyar, wacce za a yi amfani da ita lokacin farawa:

setenv("PATH", _PATH_DEFPATH, 1);

Sa'an nan kuma tsarin yana "daemonized": yana haifar da kwafin yaro na tsari ta hanyar kiran cokali mai yatsa da sabon zama a cikin tsarin yaro (kiran setsid). Ba a buƙatar tsarin iyaye, kuma yana fita:

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

Ƙarewar tsarin iyaye yana fitar da kulle a kan fayil ɗin kulle. Bugu da kari, ana buƙatar sabunta PID a cikin fayil ɗin ga yaro. Bayan wannan, an cika ma'ajin bayanai na ɗawainiya:

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

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

Sannan cron ya ci gaba zuwa babban zagayowar aiki. Amma kafin wannan, yana da kyau a yi la'akari da loda jerin ayyukan.

Tattara da sabunta jerin ayyuka

Aikin load_database yana da alhakin loda jerin ayyuka. Yana bincika babban tsarin crontab da kundin adireshi tare da fayilolin mai amfani. Idan fayiloli da kundin adireshi ba su canza ba, ba a sake karanta jerin ayyukan ba. In ba haka ba, sabon jerin ayyuka ya fara farawa.

Ana loda fayil ɗin tsarin tare da fayil na musamman da sunayen tebur:

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

Ana loda teburin masu amfani a cikin madauki:

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

Bayan haka an maye gurbin tsohon bayanan da sabon.

A cikin misalan da ke sama, kiran aikin process_crontab yana tabbatar da cewa mai amfani da ya dace da sunan fayil ɗin tebur ya wanzu (sai dai idan babban mai amfani ne) sannan ya kira load_user. Na karshen ya riga ya karanta fayil ɗin kansa ta layi:

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

Anan, ko dai an saita canjin yanayi (layukan nau'in VAR = darajar) ta amfani da ayyukan load_env / env_set, ko kuma an karanta bayanin aikin (* * * * * / hanya/to/exec) ta amfani da aikin load_entry.

Mahaɗin shigarwa wanda load_entry ya dawo shine aikinmu, wanda aka sanya shi cikin jerin ayyuka na gaba ɗaya. Aikin da kansa yana aiwatar da tantance tsarin lokaci, amma mun fi sha'awar samar da masu canjin yanayi da sigogin ƙaddamar da ayyuka:

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

Babban madauki yana aiki tare da jerin ayyuka na yanzu.

Babban Loop

Asalin cron daga Shafin 7 Unix yayi aiki a sauƙaƙe: ya sake karanta saitin a cikin madauki, ya ƙaddamar da ayyukan minti na yanzu azaman mai amfani, kuma yayi barci har zuwa farkon minti na gaba. Wannan hanya mai sauƙi akan tsofaffin injuna na buƙatar albarkatu da yawa.

An gabatar da wani nau'i na dabam a cikin SysV, wanda daemon ya yi barci ko dai har zuwa minti mafi kusa wanda aka ayyana aikin, ko kuma na minti 30. An cinye ƙarancin albarkatu don sake karanta saitin da duba ayyuka a cikin wannan yanayin, amma sabunta jerin ayyuka da sauri ya zama mara daɗi.

Vixie cron ya koma duba jerin ayyuka sau ɗaya a minti ɗaya, an yi sa'a a ƙarshen 80s an sami ƙarin albarkatu akan daidaitattun injunan 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;
}

Aikin cron_sleep yana da hannu kai tsaye wajen aiwatar da ayyuka, kiran job_runqueue (ƙididdigewa da gudanar da ayyuka) da yin_command (guda kowane ɗawainiya). Aiki na ƙarshe ya cancanci bincika daki-daki.

Gudanar da ɗawainiya

Ana aiwatar da aikin do_command a cikin kyakkyawan salon Unix, wato, yana yin cokali mai yatsa don yin aikin ba tare da an daidaita shi ba. Tsarin iyaye yana ci gaba da ƙaddamar da ayyuka, tsarin yaro yana shirya tsarin aikin:

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

Akwai dabaru da yawa a cikin tsarin child_process: yana ɗaukar daidaitaccen fitarwa da rafukan kurakurai a kan kansa, don aika shi zuwa wasiku (idan an ayyana canjin yanayi na MAILTO a cikin tebur ɗin ɗawainiya), kuma, a ƙarshe, yana jiran babban. aiwatar da aikin don kammalawa.

An ƙirƙiri tsarin ɗawainiyar ta wani cokali mai yatsu:

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

Wannan shine ainihin duk cron shine. Na bar wasu bayanai masu ban sha'awa, misali, lissafin kuɗi don masu amfani da nesa, amma na zayyana babban abu.

Bayanword

Cron shiri ne mai sauƙi mai ban mamaki kuma mai amfani, wanda aka yi a cikin mafi kyawun al'adun Unix na duniya. Ba ta yin wani ƙari, amma tana yin aikinta da ban mamaki shekaru da yawa yanzu. Samun ta hanyar lambar don sigar da ta zo tare da Ubuntu bai wuce sa'a ɗaya ba, kuma na yi farin ciki da yawa! Ina fatan zan iya raba shi tare da ku.

Ban sani ba game da ku, amma ina ɗan baƙin ciki don gane cewa shirye-shiryen zamani, tare da dabi'un da yawa da kuma abubuwan da ba a sani ba, sun dade ba su dace da irin wannan sauƙi ba.

Akwai zaɓuɓɓukan zamani da yawa don cron: tsarin lokaci-lokaci yana ba ku damar tsara hadaddun tsarin tare da dogaro, fcron yana ba ku damar daidaita yawan amfani da albarkatu ta ayyuka. Amma da kaina, crontab mafi sauƙi koyaushe ya ishe ni.

A takaice, son Unix, yi amfani da shirye-shirye masu sauƙi kuma kar ku manta da karanta mana don dandalin ku!

source: www.habr.com

Add a comment